반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags more
Archives
Today
Total
관리 메뉴

코딩몬

[Java] Class 본문

Java/Java 기초

[Java] Class

탄중이 2021. 10. 20. 18:47
반응형

Java는 객체지향 언어다.

 

여기서 객체지향 프로그래밍이란,

 : 프로그램을 구성하는 요소들 즉, 객체들이 상호작용하도록 프로그래밍 하는것을 뜻한다.

 

Java는 객체를 생성하기 위해 반드시 Class를 먼저 만들어야 한다.

 

여기서 Class란,

 : 객체를 생성하기 위한 설계도, 틀 을 의미한다.

ex>

클래스(Class) 객체(Object)
붕어빵 틀 붕어빵
자동차 설계도 자동차

 

* 클래스 선언

붕어빵 이라는 객체를 생성하기 위한 붕어빵 틀인 BoongBBang클래스 생성

  • BoongBBang.java 파일을 생성한다.
  • 저장을 하면 eclipse는 컴파일을 진행하여 디스크에 BoongBBang이라는 클래스를 생성한다.
  • 붕빵 클래스가 생성되었다고 해서 붕어빵 객체가 만들어진 것은 아니다.(붕어빵 틀만 만들었다고 붕어빵이 짠 하고 나오는게 아니잖아..?)
  • 클래스(붕빵 틀)을 만들었다면 이제 붕어빵을 만들러 가 보자.
public class BoongBBang{

}

 

* 객체 생성

붕어빵 이라는 객체를 생성하기 위해 Main Method가 있는 붕어빵 생성 Class를 만들자

public class MakeBoongBBang{
	public static void main(String args[]){
    	BoongBBang b1 = new BoongBBang();
        BoongBBang b2 = new BoongBBang();
    }
}
  • 앞서 만들어준 붕어빵 틀 BoongBBang Class타입
  • b1, b2 라는 이름의 객체를 참조하는 변수(레퍼런스 변수)
  • new 연산자 : new연산자 뒤에 나오는 생성자를 이용하여 메모리에 객체를 만들라는 명령
  • 위의 코드를 실행시켰을 시, BoongBBang이라는 객체 2개가 만들어지고, 각각의 객체를 참조하는 b1과 b2변수가 선언이 된다.

 

[ new 연산자 ]

메모리(Heap 영역)에 데이터를 저장할 공간을 할당받고,

그 공간의 참조값(reference value / 해시코드 / 메모리 주소)를 객체에게 반환한 뒤,

생성자를 호출한다.

 

 

 * new 연산자의 작동 원리

public class Main{
	public static void main(String[] arge){
    	String str = new String("문자열");
    }
}

위 코드는 "문자열"이라는 값을 담고있는 String객체를 생성하는 코드이다.

 

str이라는 변수는 Stack영역에 할당이 되고,

new String으로 생성된 "문자열"이라는 데이터 값이 Heap영역의 메모리 공간을 할당받는다.

이때, str변수는 Class타입으로 선언된 레퍼런스 변수이기 때문에, Heap영역에 있는 "문자열"이라는 데이터값이 존제하는 메모리 공간의 주소를 가리키고 있게 된다.

 

이러한 방식으로 작동하기 때문에, 만약 str2라는 변수를 하나 더 생성한 뒤 같은 값인 "문자열"이라는 값을 주어도

Heap메모리상에 새로운 영역을 할당받아 생성하므로 str2는 처음 생성한 "문자열"이라는 값을 가리키지 않는다.

(새로운 영역에 생성된 "문자열"을 가리킴)

 

 

때문에 str과 str2를 출력시켜보면 각각 다른 주소값이 출력된다.

(new 연산자로 값을 할당하지 않고, 리터럴 방식으로 값을 주었을 경우에는 출력시 같은 주소값이 나온다.)

 

  * 리터럴 방식

   변하지 않는 고정된 데이터를 할당하는 방식

public class Main{
	public static void main(String[] args){
    	String str = "문자열";
        String str2 = "문자열";
    }
}

  위 코드의 동작 방식을 살펴보자

  코드를 보면, str 과 str2라는 변수에 각각 "문자열"이라는 동일한 값으로 초기화를 시켜주었다. -> 리터럴 방식

  이 경우 "문자열"이라는 값은 Constant Pool이라는 메모리 영역에 할당이 된다.

 

  하지만, "문자열" 이라는 값을 str, str2로 두 번 호출하고 있는데 똑같은 값을 메모리에 여러 번 할당하면 메모리 낭비가

  일어난다.

  그래서 Java는 똑같은 값을 또 호출했을 때, 전에 할당했던 메모리 주소를 넘겨주게 된다.

 

  str == str2의 값이 true가 나오는 이유 역시 위와 동일한 이치로, str 과 str2가 같은 메모리 주소를 가리키고 있기 때문

  이다.

  (참고로, == 는 메모리 주소를 비교한다! 값 자체를 비교하는것이 아님! 세상에...)

 

반응형
Comments