[자바의 정석] 클래스

YJS·2023년 11월 15일
0

✔ 객체지향언어의 특징

-코드의 재사용성

-유지보수의 용이성

-중복의 제거(신뢰도 향상)

1. 클래스 정의하는 방법


클래스란?

객체를 정의해 놓은 것. 객체 생성하는데 사용. (설계도)

→ 객체를 생성하기 위해서 사용될 뿐, 객체 그 자체는 아님.

→ 데이터와 함수의 결합

객체란?

실제 존재하는 것. 클래스에 정의된 내용대로 메모리에 생성된 것. (제품)

→ 속성과 기능의 집합.

• 속성 = 멤버변수, 특성, 필드, 상태

• 기능 = 메서드, 함수, 행위

인스턴스란?

어떤 클래스로부터 만들어진 객체.

→ 객체는 모든 인스턴스를 대표하는 포괄적인 의미. 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 구체적 의미.

→ 클래스의 인스턴스화의 결과가 인스턴스이며 곧 객체임.

클래스명 변수명; // 클래스 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스 객체를 생성 후 객체의 주소를 참조변수에 저장

TV t; // TV클래스 타입의 참조변수 t를 선언
t = new TV(); // TV인스턴스를 생성한 후 생성된 TV인스턴스의 주소를 t에 저장.

2. 객체 만드는 방법 (new 키워드 이해하기)


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 + "입니다.");
	}
}

3. 메소드 정의하는 방법


메서드란?

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것. 선언부+구현부

<메서드 선언하는 법>

반환타입 메서드이름 (매개변수선언) {구현 내용}

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

4. 생성자 정의하는 방법


생성자란?

인스턴스가 생성될때 호출되는 '인스턴스 초기화 메서드'

→ 클래스 내에서 선언.

→메서드와 유사한 구조이나 리턴값이 없음.

→ 클래스명과 동일해야함.

클래스이름(타입변수명, 타입변수명){}

class Card{
	Card(){
		//매개변수가 없는 기본 생성자
	}
	Card(String k, int num){
		// 매개변수가 있는 생성자
	}
}

Card c = new Card();

1.연산자 new에 의해서 heap메모리에 Card클래스의 인스턴스가 생성됨.
2. 생성자 Card()가 호출되어 수행
3. 연산자 new의 결과로 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장됨.

→ 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아님.

-기본생성자

소스파일의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 자동으로 기본 생성자 추가함. 매개변수 없는 간단한 생성자.

-매개변수가 있는 생성자

매개변수 선언하여 호출 시 값을 넘겨받아서 인스턴스 초기화 작업에 사용 가능. 인스턴스 생성과 동시에 원하는 값으로 초기화 하는 것.

5. this 키워드 이해하기


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 메서드가 호출된 시점에 인스턴스 존재하지 않을 수 있으므로.)

profile
우당탕탕 개발 일기

0개의 댓글