객체 : 제품 (tv)
클래스 : 설계도 (tv설계도)
하드웨어(손으로 만질 수 있는 딱딱한 기계장치) -> 소프트웨어(하드웨어를 움직이는 프로그램)
HW를 어떻게 SW화 할 수 있을까? -> 사물의 속성(변수)과 기능(메소드)을 표현하면 되겠군!
객체와 인스턴스
클래스(설계도) ----인스턴스화(제품생성)---> 인스턴스(객체, 제품)
객체가 가진 속성과 기능을 사용하기 위해 객체가 필요한데 객체를 사용하려면 클래스가 필요하다.
Tv t; // t는 참조변수(리모컨)
t = new Tv( ); //객체 생성해서 참조변수에 연결
Tv t = new Tv( );
- 클래스 작성 (설계도작성)
- 객체 생성 (제품생성)
- 객채 사용 (제품사용)
ex) 참조타입의 참조변수(공간)가 생성, 주소가 0x100인 곳에 객체가 생성, 참조변수에 객체 주소 0x100 저장
하나의 참조변수에는 하나의 값만이 저장된다.
Tv t1, t2, t3; --------> Tv[ ] tvArr = new Tv[3];
Tv[ ] tvArr = new Tv[3]; //참조변수가 3개인 참조변수배열 생성
tvArr[0] = new TV( ); //객체 생성해서 참조변수에 넣어줌
클래스 정의
설계도
클래스 == 데이터 + 함수의 결합 (서로 관련있는 메서드나 변수(데이터)를 묶은 것)
사용자 정의 타입 (원하는 타입(클래스)를 직접 만들 수 있다.
class Hi {
int iv //인스턴스 변수
static int cv; //클래스 변수(static 변수)
void method( ) {
int lv = 0; //지역변수
}
}
* 클래스 영역 - iv, cv
* 메서드 영역 - lv
* 인스턴스 변수(iv)에 static을 붙이면, 클래스 변수(cv)
* 클래스 영역에는 선언문만 가능(일반 문장 불가)
* 객체 == iv를 묶어 놓은 것
* 클래스 변수 - 객체 생성 필요x, 아무때나 사용 가능
* 인스턴스 변수 - 객체가 생성 후 사용가능
메서드는 선언부와 구현부로 이루어져있다.
반환타입 메서드이름 (매개변수(입력값)) -> 선언부
{ //메서드 호출시 수행될 코드 } -> 구현부
반환값이 없는 경우 반환타입으로 'void'를 적어야 한다.
ex) int result = add(3,5); //작업결과를 저장할 변수가 필요.
print99dan( );
기본형 매개변수
변수의 값을 읽기만 할 수 있다, 변경 불가
참조형 매개변수
변수의 값을 읽고 변경 할 수 있다.
참조형 반환타입
객체의 주소를 반환한다.
static (클래스) 메소드
객체 생성 없이 '클래스이름.메서드이름( )'으로 호출
인스턴스 멤버(iv, im) 사용 불가(매개 변수 사용)
-> static 메서드 호출시 객체가 없을 수도 있기 때문에 사용 불가
static 변수 사용 가능
인스턴스 메소드
인스턴스 생성 후, '참조변수.메서드이름( )'으로 호출
인스턴스 멤버(iv, im), 클래스 변수(cv) 사용 가능.
* 객체 == iv 묶음
* 객체 속성(변수) 중에서 공통 속성(변수)에 static 붙인다.
* 인스턴스 멤버(iv,im)를 사용하지 않는 메서드에 static붙인다.
* iv는 객체 생성 후 사용 가능, cv는 아무때나 사용 가능
class Point3 {
int x;
int y;
String getLocation () {
return "x : "+ x + " y : "+y;
}
}
class MyPoint3D extends Point3{
int z;
//조상의 getLocation()을 오버라이딩
String getLocation() {
return "x : "+ x + " y : "+ y +" z : "+ z;
}
}
오버라이딩의 성립조건
선언부(반환타입, 메서드이름, 매개변수 목록)가 조상 클래스의 메서드와 일치해야 한다.
접근제어자(public, protected,default, privite)를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
예외는 조상클래스의 메서드보다 많이 선언할 수 있다.
오버라이딩 vs 오버로딩
오버로딩 - 기존에 없는 새로운 메서드를 정의하는 것 -> 이름만 같은 메서드 (new!!) (상속과 관계x)
오버라이딩 - 상속받은 메서드의 내용을 변경하는 것 (change!!)
생성자
인스턴스가 생성될 떄마다 호출되는 '인스턴스를 초기화시키는 메서드' (=iv초기화 메서드)
생성자가 필요한 이유? -> 조금 더 편하게 초기화 하기 위해서
생성자의 성립조건
이름이 클래스 이름과 같아야 한다.
반환값이 없다. (항상 없기 때문에 void 안붙임)
모든 클래스는 반드시 생성자(1개 이상)를 가져야 한다.
(생성자가 클래스 안에 한개도 없을때, 컴파일러가 자동으로 기본생성자를 추가해준다. )
//1.객체생성
Time t = new Time();
//2.iv초기화
t.hour = 12;
t.minute = 34;
t.second = 56;
//객체생성과 iv초기화를 동시에 처리
Time t = new Time(12, 34, 56); //생성자 호출
클래스 이름(타입 변수명, 타입 변수명 -> 매개변수){
//인스턴스 생성시 수행될 코드,
//주로 인스턴스 변수의 초기화 코드를 적는다.
}
class Car {
String color;
String grearType;
int door;
Car(){} //기본 생성자
Car(String c, String g, int d){ //매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
Car c = new Car("white", "auto", 4) // 생성자 호출
생성자 this()
같은 클래스 안에서 생성자가 다른 생성자를 호출할때 사용 (코드의 중복제거 효과)
다른 생성자 호출시 첫 줄에서만 사용가능.
참조변수 this
인스턴스 자신을 가르키는 참조변수 (인스턴스의 주소가 들어있다.)
인스턴스 메서드 (생성자 포함)에서만 사용가능 (모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.)
지역변수(lv)와 인스턴스 변수(iv)를 구별할때 사용
Car(String color, String grearType, int door){
//this를 붙여서 iv와 lv를 구별
this.color = color;
this.grearType = grearType;
this.door = door;
}
//this(참조변수).변수이름
변수의 초기화, 멤버변수의 초기화
멤버변수의 명시적 초기화(간단 초기화 =)
선언시 = (대입연산자 이용)
class Car {
int door = 4; //기본형변수의 초기화
Engine e = new Engine(); //참조형변수 초기화 (객체를 생성해서 대입)
}
참조형변수가 가질 수 있는 값은 null(기본값), 객체 주소가 있다.
초기화 블럭 (복잡한 초기화)
iv초기화 -> 인스턴스 초기화 블럭 : { //여러문장작성 }
cv초기화-> 클래스 초기화 블럭 : static { }
생성자 (iv초기화, 복잡한 초기화)
클래스명( ){ }
- 자동초기화 0
- 간단초기화 =
- 복잡초기화 { }, static { }, 생성자
멤버변수의 초기화
클래스 변수(cv) 초기화 시점 : 클래스가 처음으로 로딩(메모리에 올라갈때)될 때 단 한 번
인스턴스 변수(iv) 초기화 시점 : 인스턴스가 생겨날 때마다.