티스토리 뷰

728x90
반응형

클래스의 용도에는 다음의 3가지가 있다.

 

[ 클래스의 용도 ]

1. 데이터 type의 역할

2. 객체의 설계도 역할

3. static 필드나 static 메소드를 감싸는(boxing) 역할

 

이번 글에서는 클래스의 용도 1, 2에 대해 살펴볼 예정이다. 

다음의 예제들을 통해 살펴보자!


1) Car.java - name, brand를 필드로, drive()를 메소드로 갖는 Car클래스 

package test.mypac;//패키지명
/*
 * 	[ 클래스의 용도 ]
 *  1. 데이터 type의 역할을 한다.
 *  2. 객체의 설계도 역할을 한다.
 *  3. static 필드나 static 메소드를 감싸는(boxing) 역할을 한다.
 */
public class Car {//클래스명
	public String name;//필드명(클래스 안에 작성한 것은 지역변수가 아님)
	public String brand;
	public void drive() {//메소드명
		System.out.println("부릉부릉 달려요!");
	}
	
	public void showBrand() {
		/* [ this 에 대한 이해 ]
		 * 		
		 * 클래스 설계 단계에서는 잘 모르지만 이 클래스로 객체를 생성했을 때
		 * 할당 받는 바로 자신의 객체의 참조값을 가리킨다.
		 */
		System.out.println(this.brand);
		
	}

}

 

클래스 내에는 필드와 메소드를 생성할 수 있다.

자바에는 글로벌 영역이 없고 필드영역과 로컬영역이 있다. 

지역변수와 클래스 내에서 생성할 필드를 구분해야 할 것이, 지역변수는 선언만 하면 변수가 생성되지 않지만, 필드는 선언만해도 자동으로 null 값이 들어간다.

 

Car클래스에는 String 타입의 name, brand 필드와 반환값이 없는 drive(), showBrand() 메소드가 있다. 

drive 메소드는 호출 시 "부릉부릉 달려요!" 라는 문자열을 출력하는 기능을 하고,

showBrand 메소드는 showBrand가 속한 객체, 즉, new를 통해 Car 객체가 생성됐을 때 그 객체의 brand 필드를 출력하는 기능을 한다.

 

자바스크립트에서 객체는 저장소와 기능을 담는다고 하였는데, 자바에서 저장소는 필드, 기능은 메소드로 불림을 알 수 있다.

또한, 클래스의 두번째 용도인 객체의 설계도 역할을 하는 것을 알 수 있다. 

 

 

그러면 생성한 Car 클래스를 활용하는 모습을 확인해보자.

 


 

1-1) MainClass01.java

package test.main;

import test.mypac.Car;

public class MainClass01 {
	public static void main(String[] args) {
		//Car 클래스로 객체를 생성하고 그 참조값을 car1 이라는 Car type 지역변수에 담기 
		Car car1 = new Car();
		
		//car1 객체의 name이라는 필드에 저장된 값을 a라는 이름의 String type 지역변수에 담기
		String a = car1.name;
		
		// car1 객체의 drive라는 메소드 호출하기
		car1.drive();
		
		
	}
}

 

 

run 결과

Car 클래스와 MainClass01이 같은 패키지에 들어있다면 import할 필요가 없지만, 나는 둘을 서로 다른 패키지에 두었기 때문에 import test mypac.Car(mypac은 Car 클래스가 있는 패키지명)을 해주었다.

import를 쉽게 사용하는 법은 import를 원하는 클래스명 뒤에서 ctrl+space bar을 해주면 된다.

 

 

객체 생성은 new 를 이용하여 할 수 있다. 클래스의 첫번째 용도인 데이터 type의 역할을 수행하는 것을 확인할 수 있다.

Car car1 = new Car();

 

자바스크립트 공부할 때 익혔던 것처럼, 객체는 힙 영역에 생성이 되고, 변수는 스택 영역에 생성이 된다. 

따라서, car1이라는 변수가 스택 영역에 생성되고, 힙 영역에 생성된 Car 객체의 참조값을 car1이 참조하는 형식이다.


아래 그림을 통해 더 정확하게 확인해보자!

 

car1.name을 통해 힙 영역에 생성된 car1 객체의 name을 참조하고, 마찬가지로 car1.drive()를 통해 힙 영역의 car 객체의 drive메소드를 호출할 수 있음을 확인할 수 있다.

 

좀 더 깊이 나아가자면, name은 String 타입으로, 참조 데이터 타입이다. 

따라서, name 역시 객체가 따로 생성되고, 그 객체의 참조값이 car1의 name안에 들어있는 방식이다.

중요한 것은, 자바스크립트에서는 함수 역시 객체의 일종이었지만, 자바에서는 함수는 그 자체로 존재할 수 없고 무조건 객체에 감싸져서 존재해야 한다는 점이다.  

 


 

1-2) MainClass02.java - Car 클래스를 활용하여 직접 참조로 car 객체의 필드값에 값 넣어주기

package test.main;

import test.mypac.Car;

public class MainClass02 {
	public static void main(String[] args) {
		Car car1 = new Car();
		Car car2 = new Car();
		Car car3 = new Car();
		
		car1.name ="소나타";
		car2.name ="프라이드";
		car3.name ="아반떼";
	}

}

 


 

1-3) MainClass03.java - car 객체 생성하고, 직접 참조로 필드에 값을 넣어주고, 메소드 호출하기

package test.main;

import test.mypac.Car;

public class MainClass03 {
	public static void main(String[] args) {
		Car car1 = new Car();
		Car car2 = new Car();
		
		car1.brand ="현대";
		car2.brand ="기아";
		
		car1.showBrand();
		car2.showBrand();
	}
	
	
}

 

 

run 결과

 

1-2 번과 유사한 예제이다.

출력으로는 1-2번과 다르게, 메소드를 호출한다.

showBrand는, 그 객체의 브랜드 필드를 출력하는 메소드이기 때문에,

필드값으로 각각 넣어준 "현대"와 "기아"가 각각 출력됨을 확인할 수 있다.


이번 예제 역시 그림으로 그 구조를 더 자세히 살펴보자!

 

보면, car1과 car2 객체가 서로 다른 참조값을 가지고 힙 영역에 각각 생성이 되는 모습을 확인할 수 있다.

car1과 car2는 같은 Car클래스이므로 생성된 객체의 구조가 동일함을 확인할 수 있다. 

 

 

위 그림에서 실행 순서를 정확하게 확인할 수 있다.

showBrand는 메소드이기 때문에, 호출되면 showBrand 메소드가 있는 위치로 가서 실행되었다가, 종료 되면 다시 main이 있는 곳으로 돌아온다. 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함