Post

[Java] 07. 클래스, 객체, 인스턴스

[Java] 07. 클래스, 객체, 인스턴스
1
2
3
4
5
public class Main
    public static void main(String[] args) {
        // 코드 작성
    }
}

만약 ‘Main’ 클래스를 생성할 경우 위처럼 사용하게 될 것입니다
그러면 클래스를 알아보고, 뒤이어 ‘객체’와 ‘인스턴스’도 간단하게 이해해보도록 합시다



1. 클래스 (Class) / 객체 (Object) / 인스턴스 (Instance)

  • 클래스 : 붕어빵 틀
  • 객체 : 붕어빵
  • 인스턴스 : 슈크림 붕어빵, 팥 붕어빵 등

가장 자주 사용되는 비유는 붕어빵입니다
일단 대충은 무슨 느낌인지 알기 쉬우니 이렇게만 보고 본론으로 들어갑시다


1-1. 클래스 (Class)

저희가 위 예시에서 ‘Main’으로 만든 클래스같은거로 이해하면 쉬울 것 같습니다
‘붕어빵 틀’처럼, 변수와 메서드 등 코드를 작성해서 만들면 됩니다


1-2. 객체 (Object)

슈크림 붕어빵이든 팥 붕어빵이든 어쨌든 큰 틀로 바라보면 ‘붕어빵’이라고 할 수 있습니다
‘사람’으로 예를 들면 마치 철수와 영희 등 누군가를 지목해도 사람이라는 범주에 드는 것 처럼요


1-3. 인스턴스 (Instance)

그러면 큰 범주에 들어가는 붕어빵 또는 사람 중에서 딱 무언가를 지목하면 ‘인스턴스’라고 할 수 있겠습니다
팥을 넣은 붕어빵, 이름이 철수인 사람같이 말이죠



2. Java에서 이해하기

이렇게 예시로 느낌을 이해하기 쉬우니 이번에는 코드를 보도록 합시다

1
2
3
4
5
6
7
8
9
10
// Person.class
public class Person {   /* Person이라는 '클래스' */
    public String name;
    public int age;
    public String email;

    public void print() {
        System.out.println("안녕하세요, 저는 "+name+"이고 나이는 "+age+"살 입니다.");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Main.class
public class Main {
    public static void main(String[] args) {

        Person p1, p2;          /* p1, p2 : '객체', 변수처럼 선언 */

        p1 = new Person();      /* p1에 새로운 사람의 '인스턴스' 주입 */
        p1.name = "철수";
        p1.age = 21;
        p1.email = "ss@java.class";
        p1.print();

        p2 = new Person();      /* p2에 새로운 사람의 '인스턴스' 주입 */
        p2.name = "영희";
        p2.age = 21;
        p2.email = "hh@java.class";
        p2.print();
    }
}

위 예시의 ‘Person’ 객체의 변수는 ‘public’으로 작성이 되어있지만, 원래 캡슐화 그리고 정보 은닉 등을 위해서는 ‘private’로 지정한 뒤, Getter과 Setter라는 것을 사용해야 합니다
이 내용은 다음 시간의 ‘접근 제한자’에서 알아보도록 합시다

  1. Person이라는 클래스를 만들어줍니다
  2. p1, p2라는 Person 객체를 선언합니다
  3. p1, p2에 각각 new Person()으로 새로운 인스턴스를 주입합니다

2, 3을 합쳐 ‘Person p = new Person();’으로 작성할 수 있습니다



3. 객체가 메모리에서 동작하는 구조

  1. metaspace : 클래스의 정보가 들어가는 공간
    • Person의 변수 또는 메서드 정보 등, JVM이 알아야 할 class의 모든 정보를 포함
  2. stack : 메서드가 실행되는 공간
    • 메서드가 호출될 때마다 새로운 ‘스택’ 프레임이 위로 쌓이는 구조
    • 스레드별로 별도 관리
  3. heap : 객체가 저장되는 공간
    • 크기가 바뀔 수 있는 참조형 변수(객체)들 저장하는 공간
    • 가비지 컬렉터로 정리됨
    • 상수도 heap에 저장

스택은 자료구조의 ‘stack’을 알아두면 이해하기 쉽습니다


처음 JVM 글을 봤던 것 처럼 이해가 어려울 수 있지만 Java를 배우고 다시 내용을 복습하면서 이해하면 좋을 것 같습니다
참고하면 좋은 글 : https://h-yeon00.tistory.com/16

This post is licensed under CC BY 4.0 by the author.