(JAVA)객체

강병우·2023년 10월 21일

기본형 변수와 참조형 변수

  • 기본형 변수는 소문자로 시작한다.
  • 기본형 변수는 실제로 숫자를 가지고 있다.
boolean b = true;
char c = 'a';
byte bt = 1;
short s = 2;
int i = 3;
long l = 4L;
float f = 5.5f;
double d = 5.5;
  • 참조형 변수는 대문자로 시작한다.
  • 기본형 변수 8종 이외의 변수는 모두 참조형 변수이다.
  • 참조형 변수에는 실체가 없다. 실체는 외부에 저장된다.
  • 참조형 변수에는 실체를 조종할 수 있는 리모콘이 저장된다.
  • 자바에서 리모콘의 크기는 모두 같다.
String str;
str = "안녕" + "하세요.";
  • 엄밀히 말하면 str 에는 "안녕하세요." 가 들어있지 않다.
  • str 에는 "안녕하세요." 라는 문자열 객체를 조종할 수 있는 리모콘이 들어있다.

객체와 메모리

  • 각 함수는 컴파일 타임에 사용메모리 크기가 정해지고, 런타임에 호출되면 해당 크기만큼 스택에 할당된다.
  • 지역변수는 할당된 스택 안에 위치한다.
  • 참조형 변수에는 리모컨이 저장되며, 저장된 리모콘은 힙에 위치한 객체를 가리킨다.
int a = 50;
int b = a; // 50은 2군데에 저장되어 있다.(a와 b)

int[] arr1 = new int[3]; // 객체가 힙에 생성되고 그 객체의 리모콘이 arr1 변수에 저장된다.
int[] arr2 = arr1; // 객체가 2개가 된게 아니라 리모콘만 2개가 되었다.

비주얼라이저를 통해 확인 가능.

메모리 반납

  • 메모리는 항상 부족하므로 사용하지 않는 객체는 삭제된다.
  • 지역변수는 함수가 끝날때, 객체는 외톨이가 될때(자신을 가리키는 리모컨이 없을 때) 삭제된다.
public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        sub1();

        int e = 50;
        int f = 60;
    }

    static void sub1() {
        int c = 30;
        int d = 40;
    }
}

지역변수 소멸 과정

public class Main {
    public static void main(String[] args) {
        int[] arr1 = new int[3];
        int[] arr2 = new int[3];

        arr1[0] = 10;
        arr1[1] = 20;
        arr1[2] = 30;

        sub1();

        System.out.println(arr1.length);

        arr1 = null;

        System.out.println("끝!");
    }

    static void sub1() {
        int[] arr3 = new int[3];
    }
}

객체 소멸과정

객체의 쓰임

  • 객체(인스턴스)는 폴더이다. 객체로 여러 변수들을 묶을 수 있다.
//객체를 사용하지 않았을 때
int person1_0 = 1; // 사람 1의 번호
int person1_1 = 20; // 사람 1의 나이
int person1_2 = 170; // 사람 1의 키

int person2_0 = 2; // 사람 2의 번호
int person2_1 = 30; // 사람 2의 나이
int person2_2 = 180; // 사람 2의 키

//객체를 사용했을 때
int[] person1 = new int[3]; // 객체, 인스턴스가 생긴다.
person1[0] = 1; // 사람 1의 번호, 인스턴스 변수
person1[1] = 20; // 사람 1의 나이, 인스턴스 변수
person1[2] = 170; // 사람 1의 키, 인스턴스 변수

int[] person2 = new int[3]; // 객체, 인스턴스가 생긴다.
person2[0] = 2; // 사람 2의 번호, 인스턴스 변수
person2[1] = 30; // 사람 2의 나이, 인스턴스 변수
person2[2] = 180; // 사람 2의 키, 인스턴스 변수
  • 자바에는 이미 다수의 클래스가 있지만, 그것만으로는 우리가 만들려는 앱의 복잡성을 감당할 수 없다.
//직접 만든 클래스로 객체를 만들어서 사용했을 때
class GameCharacter {
	int no;
	int age;
   	int height;
}

GameCharacter person1 = new GameCharacter(); // 객체, 인스턴스가 생긴다.
person1.no = 1; // 사람 1의 번호, 인스턴스 변수
person1.age = 20; // 사람 1의 나이, 인스턴스 변수
person1.height = 170; // 사람 1의 키, 인스턴스 변수

GameCharacter person2 = new GameCharacter();
person2.no = 2; // 사람 2의 번호, 인스턴스 변수
person2.age = 30; // 사람 2의 나이, 인스턴스 변수
person2.height = 180; // 사람 2의 키, 인스턴스 변수

정리

static

  • int age 를 인스턴스 변수로 만들면 각각의 객체가 하나씩 변수를 가진다.
class Person {
  int maxSpeed;
}

Person p1 = new Person();
p1.maxSpeed = 100;
Person p2 = new Person();
p2.maxSpeed = 200;
Person p3 = new Person();
p3.maxSpeed = 300;

System.out.println(p1.maxSpeed); // 100
System.out.println(p2.maxSpeed); // 200
System.out.println(p3.maxSpeed); // 300

비주얼라이저

  • 반면 int age 를 스태틱 변수로 만들면 각각의 객체에 age 변수가 존재하지 않는다. 오직 클래스가 변수를 가진다.
class Person {
    static int maxSpeed;
}

Person p1 = new Person();
p1.maxSpeed = 100; // 이 코드는 실질적으로 `Person.maxSpeed = 100;` 으로 처리된다. 왜냐하면 p1 객체에는 maxSpeed 변수가 없고, maxSpeed 변수는 클래스에 1개만 존재하기 때문이다.
Person p2 = new Person();
p2.maxSpeed = 200;
Person p3 = new Person();
p3.maxSpeed = 300;

System.out.println(p1.maxSpeed); // 300 // 이 코드는 실질적으로 `System.out.println(Person.maxSpeed);` 와 같다.
System.out.println(p2.maxSpeed); // 300
System.out.println(p3.maxSpeed); // 300

비주얼라이저

  • 변수와 메서드에 static 을 붙이는게 편할 때가 있다.
class Person {
    int 나이;
    static int 인류평균나이; // 각각의 객체가 가질 필요없는 변수는 static 을 붙여서 `Person.인류평균나이` 와 같은 방식으로 접근하는게 좋다.
  
    void 자기소개() { System.out.println("제 나이는 " + this.나이 + "살 입니다."); }
    static void 인류평균나이소개() { System.out.println("인류평균나이는 " + 인류평균나이 + "살 입니다."; } // 각각의 객체가 가질 필요없는 메서드는 static 을 붙여서 `Person.인류평균나이소개();` 와 같은 방식으로 사용하는게 좋다.
}

비주얼라이저


0개의 댓글