코린이의 소소한 공부노트

클래스, 객체, 인스턴스 본문

Java

클래스, 객체, 인스턴스

무지맘 2022. 2. 20. 20:17

객체실제로 존재하는 사물 또는 개념을 뜻한다. 이러한 객체를 정의해 놓은 것을 자바에서는 클래스라고 부른다.

클래스는 객체를 생성하는 데 사용하고, 객체는 객체가 가지고 있는 기능과 속성에 따라 그 쓰임새가 다르다. 클래스를 제품 설계도라고 한다면 객체는 그것을 이용해서 만든 제품이라고 생각하면 된다. 특정 클래스에서 만든 객체를 지칭할 때는 객체보다 인스턴스라는 표현을 많이 쓰고, 모든 인스턴스를 통틀어서 표현할 때는 객체라고 표현한다.

(비유 예시 - 붕어빵 틀로 찍어낸 붕어빵들 중 슈크림 붕어빵을 가장 좋아한다.)

 

1. 클래스

클래스에는 객체의 속성, 기능이 정의되어있다. 예를 들어 사람 클래스에 다음과 같은 속성과 기능이 있다고 해보자.

  - 속성: 이름, 나이, 현재 상태(자는지 깨어있는지)

  - 기능: 인사하기, 먹기, 자기, 일어나기

이를 코드로 표현해보면 다음과 같다.

// Person.java
class Person{
	// 속성 - 변수로 표현
	String name; // 기본값인 null이 저장됨
	int age; // 기본값인 0이 저장됨
	boolean isSleep; // 기본값인 false가 저장됨
	
	// 기능 - 메서드로 표현
	void sayHello() { System.out.println("안녕하세요? " + age + "살 " + name + "입니다."); }
	void eat(String food) { System.out.println(food + " 먹는 " + name); }
	void sleep() { isSleep = true; }
	void wakeup() { isSleep = false; }	
}

클래스는 사용자가 원하는 대로 속성과 기능을 추가하면 되는데, 작성 시 유의사항이 있다.

1) 기본적으로 1개의 소스 파일에 1개의 클래스만 작성한다.

// Person.java
class Person {}

2) 한 파일에 여러 개의 클래스를 만드는 것도 가능하다.

  - pubilc클래스가 있는 경우, 소스파일의 이름과 public클래스 이름이 반드시 일치해야 한다.

// Person.java

// 올바른 예시
public class Person {} // 클래스이름 = 파일이름
class Person2 {}

// 잘못된 예시
class Person {}
public class Person2 {} // 클래스이름 != 파일이름
// 클래스 이름을 바꾸거나 파일 이름을 바꿔서 일치시켜야 한다

  - public클래스가 없는 경우, 클래스 이름 중 아무거나 골라 소스파일 이름으로 하면 된다.

// 올바른 예시 1
// Person.java
class Person {} // 클래스이름 = 파일이름
class Person2 {}

// 올바른 예시 2
// Person2.java
class Person {}
class Person2 {} // 클래스이름 = 파일이름

// 잘못된 예시
// Person.java
class Person2 {} // 클래스이름 != 파일이름
class Person3 {} // 클래스이름 != 파일이름

3) 한 파일에 작성할 수 있는 public클래스의 개수는 최대 1개이다.

// 올바른 예시 1
// Person.java
class Person {} // 클래스이름 = 파일이름
class Person2 {}

// 올바른 예시 2
// Person.java
public class Person {} // 클래스이름 = 파일이름
class Person2 {}

// 잘못된 예시
// Person.java
public class Person {} // 클래스이름 = 파일이름
public class Person2 {} // 이 클래스 앞의 public을 지워야 한다
// Person2클래스도 public으로 유지하고 싶다면
// 파일을 따로 만들어서 분리해야 한다

4) 자바는 대소문자를 구분하기 때문에, 이것이 불일치하면 엉뚱한 파일의 메인 메서드가 실행될 수 있다.

// 올바른 예시
// Person.java
public class Person {} // 클래스이름 = 파일이름
class Person2 {}

// 잘못된 예시
// Person.java
public class person {} // 앞 글자 대소문자 불일치
class Person2 {}

 

2. 객체

객체는 클래스를 이용하여 실제로 그 속성과 기능을 구현해놓은 것을 말한다. 이때 속성은 변수로, 기능은 메서드로 표현된다. 클래스를 이용해 인스턴스(객체)를 생성하는 과정을 인스턴스화라고 부른다. 클래스를 가지고 객체를 만들어야 실제 프로그래밍에서 사용할 수 있다.

위에서 만든 사람 클래스로 사람 객체 하나를 생성해보자.

// 1) Person 객체의 참조변수 p1 생성
Person p1;

// 2) 객체를 생성한 후 객체의 주소를 참조변수에 저장
p1 = new Person();

// 1,2번 과정을 한 줄로 쓸 수 있다
// Person p1 = new Person();

// 3) 객체 사용해보기 - 멤버변수 값 변경, 메서드 호출(사용)
p1.name = "muzi";
p1.age = 10;
p1.sayHello(); // "안녕하세요? 10살 muzi입니다."

객체 1개를 만들어봤다. 이제 메모리의 상태를 확인해보자.

1) 참조변수 p1을 생성하면 메모리에 변수 1개가 생성되고 p1이라는 이름이 붙는다.

2) new 키워드로 객체를 생성하면 저장공간에 객체의 변수, 메서드 자리가 생기고, 객체의 주소를 반환한다. 이 주소값을 p1에 저장하면 참조변수와 객체가 연결된다(하늘색 화살표).

3) 멤버변수 값을 바꾸면 p1의 주소를 따라가서 나온 객체의 멤버변수 값이 변경되고(빨간색 글씨), 메서드를 호출하면 해당 메서드가 실행된다(인사말 출력).

 

사람은 사회적 동물이다. 혼자는 외롭기 때문에 사람 객체 1개를 더 만들어보자.

Person p2 = new Person();
p2.name = "choonsik";
p2.age = 2;
p2.eat("고구마"); // "고구마 먹는 choonsik"

사람 객체가 하나 더 생성된 지금, 메모리는 어떤 상황일까?

객체가 다르기 때문에, 당연하겠지만 2개의 객체가 메모리상에 존재하게 된다.

우리나라는 유교사상이 바탕에 깔려있기 때문에, 처음 만나면 나이로 서열정리를 하게 된다.

p1.sayHello(); // "안녕하세요? 10살 muzi입니다."
p2.sayHello(); // "안녕하세요? 2살 choonsik입니다."
// 각 참조변수가 가리키는 객체를 따라가 해당 객체의 메서드를 호출하게 된다.

춘식이는 처음 만난 무지에게 반해버렸다. 그래서 무지의 탈을 쓰고 무지흉내를 내고 다니기 시작했다.

p2 = p1;
p1.sayHello(); // "안녕하세요? 10살 muzi입니다."
p2.sayHello(); // "안녕하세요? 10살 muzi입니다."
// 참조변수에는 1개의 값만 저장되기 때문에 참조변수 1개는 객체 1개만 가리킬 수 있다.
// 참조변수 p2에 p1값이 대입되면서 p2가 0x300을 가리키게 된다.

춘식이는 무지를 너무 좋아한 나머지... 결국 자기 자신을 잃어버렸다는 슬픈 전설이 전해지고 있다.

  - p2가 처음에 가리키던 객체(주소:0x400)는 참조변수의 연결이 끊겨 더 이상 접근할 수 없게 되었다.

  - 자바의 청소부 가비지 컬렉터(garbage collector)가 주기적으로 감시하고 있다가 사용 불가가 된 객체를 정리해 메모리 공간을 확보한다.

 

갑자기 이야기가 산으로 간 느낌이 있네... 어쨌든! 말하고 싶었던 내용은

1) 한 클래스로 여러 개의 객체가 생성 가능하다.

2) 객체는 참조변수에 연결되어있을 때 사용이 가능하다.

  - 하나의 객체에 여러 참조변수를 연결할 수 있다.

  - 하나의 참조변수에 여러 객체를 연결하는 것은 불가능하다.

'Java' 카테고리의 다른 글

클래스의 정의  (0) 2022.03.02
객체 배열  (0) 2022.03.01
객체지향 언어의 도입 배경과 특징  (0) 2022.02.20
배열 (5) Arrays클래스  (0) 2022.02.20
String 클래스  (0) 2022.02.06