✔ 객체지향언어의 특징
-코드의 재사용성
-유지보수의 용이성
-중복의 제거(신뢰도 향상)
클래스란?
객체를 정의해 놓은 것. 객체 생성하는데 사용. (설계도)
→ 객체를 생성하기 위해서 사용될 뿐, 객체 그 자체는 아님.
→ 데이터와 함수의 결합
객체란?
실제 존재하는 것. 클래스에 정의된 내용대로 메모리에 생성된 것. (제품)
→ 속성과 기능의 집합.
• 속성 = 멤버변수, 특성, 필드, 상태
• 기능 = 메서드, 함수, 행위
인스턴스란?
어떤 클래스로부터 만들어진 객체.
→ 객체는 모든 인스턴스를 대표하는 포괄적인 의미. 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적 의미.
→ 클래스의 인스턴스화의 결과가 인스턴스이며 곧 객체임.
클래스명 변수명; // 클래스 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스 객체를 생성 후 객체의 주소를 참조변수에 저장
TV t; // TV클래스 타입의 참조변수 t를 선언
t = new TV(); // TV인스턴스를 생성한 후 생성된 TV인스턴스의 주소를 t에 저장.
class Tv {
//Tv의 멤버변수 선언
String color;
boolean power;
int channel;
//Tv의 메서드
void power() {power = !power;}
void channelUp() {++channel;}
void channelDown() {--channel;}
class TvTest{
public static void main(String args[]) {
Tv t; // Tv클래스의 참조변수 t 선언(메모리에 t를 위한 공간 마련)
t= new Tv(); // new연산자로 인해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성됨. 대입연산자에 의해 생성된 객체의 주소값이 참조변수 t에 저장됨.
t. channel =7;// 참조변수t에 저장된 주소에 있는 인스턴스 멤버변수 channel에 7저장.
t. channeldown();// 참조변수t가 참조하고 있는 Tv 인스턴스의 channelDown메서드호출
System.out.println("현재 채널은 " + t.channel + "입니다.");
}
}
메서드란?
특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것. 선언부+구현부
<메서드 선언하는 법>
반환타입 메서드이름 (매개변수선언) {구현 내용}
int add (int x, int y) {
int result = x+y;
return result;
}
→ 매개변수 값을 입력받을 필요가 없다면 () 비움. 여러개도 입력 가능.
→메서드의 작업 수행 결과인 반환값의 타입이 필요 없을 경우 void.
(반환값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return문 필요. 반환타입이 void인 경우에는 컴파일러가 자동적으로 return;을 마지막에 추가함)
→ 매개변수는 여러개여도 반환값은 최대 한개만 허용.
→ 반환값과 반환타입이 일치 혹은 자동형변환 가능해야함.
→매개변수도 매서드 내에서 선언되었으므로 지역변수임.
<메서드 호출하는 법>
메서드이름(값1, 값2);
int result = add(3,5);
→ 메서드 호출시 ()안에 지정한 값들을 인자라고 함.
→인자는 메서드 호출되면서 매개변수에 대입되므로 인자의 타입과 매개변수의 타입이 일치 혹은 자동형변환 가능해야함.
cf. 메서드 호출 시 JVM 메모리 구조
-메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받음
-메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스텍에서 제거됨.
-호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드
-아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드
출처: 자바의 정석 3판 P263
생성자란?
인스턴스가 생성될때 호출되는 '인스턴스 초기화 메서드'
→ 클래스 내에서 선언.
→메서드와 유사한 구조이나 리턴값이 없음.
→ 클래스명과 동일해야함.
클래스이름(타입변수명, 타입변수명){}
class Card{
Card(){
//매개변수가 없는 기본 생성자
}
Card(String k, int num){
// 매개변수가 있는 생성자
}
}
Card c = new Card();
1.연산자 new에 의해서 heap메모리에 Card클래스의 인스턴스가 생성됨.
2. 생성자 Card()가 호출되어 수행
3. 연산자 new의 결과로 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장됨.
→ 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아님.
-기본생성자
소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 자동으로 기본 생성자 추가함. 매개변수 없는 간단한 생성자.
-매개변수가 있는 생성자
매개변수 선언하여 호출 시 값을 넘겨받아서 인스턴스 초기화 작업에 사용 가능. 인스턴스 생성과 동시에 원하는 값으로 초기화 하는 것.
this(): 생성자 간에도 서로 호출이 가능.
→ 생성자의 이름으로 클래스 이름 대신 this 사용.
→ 한 생성자에서 다른 생성자를 호출할때는 반드시 첫줄에서만 호출이 가능.
class Car{
String color;
String gearType;
int door;
Car()
{
this("white", "auto",4); //생성자Car()에서 또다른 생성자를 호출
}
Car(String color){
this(color, "auto",4);
}
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
this 참조변수
Car(String color, String gearType, int door){
this.color = color;
this.gearType = gearType;
this.door = door;
}
-> this.color는 인스턴스변수
-> color는 생성자의 매개변수로 정의된 지역변수
-this는 참조변수로 인스턴스 자신을 가리킴. 인스턴스의 주소가 저장되어 있음. 모든 인스턴스메서드에 지역변수로 숨겨진채 존재.
→this사용할 수있는 것은 인스턴스멤버뿐. (static메서드에서는 인스턴스 생성 하지 않고 호출될 수 있으므로 static 메서드가 호출된 시점에 인스턴스 존재하지 않을 수 있으므로.)