클래스와 객체

황희윤·2023년 9월 8일

객체(object) : 사용할 수 있는 실체

클래스 : 객체를 만들기 위한 설계도

클래스가 만들어진 배경

1. 변수

  • 다양한 형태의 데이터를 저장하기 위해 각각의 데이터를 저장할 수 있는 변수라는 문법 요소를 만들어 사용
  • ex) String, int, double

2. 배열

  • 데이터의 종류가 많아질수록 데이터의 개수만큼 변수명을 짓거나 관리하는 일이 버거워짐
  • 배열을 사용하면 같은 자료형인 변수들을 묶어 1개의 새로운 자료형으로 관리할 수 있으므로 관리해야 할 변수의 개수를 현저하게 줄일 수 있다.

3. 구조체 (struct)

  • 서로 다른 자료형도 관리할 수 있고 싶어서 만든 문법
struct Score{
	int[] scores = {80, 67, 92, 44};
    double avg = 72.3;
}

4. 클래스

  • 구조체는 말 그대로 데이터만 묶어 놓은 것
  • 클래스는 다양한 자료형의 데이터를 묶어 관리할 수 있을 뿐 아니라, 데이터를 처리하는 다양한 기능까지 함께 관리할 수 있다.
  • 메서드 : 클래스에 포함돼 클래스 안에 있는 데이터를 처리하는 기능
  • 자바의 기본 문법

클래스가 필요한 이유

  1. 수많은 객체를 효율적으로 만들어 내기 위해
  2. 같은 종류의 객체라는 것을 확실히 하기 위해

클래스

내부 구성 요소

1. 필드 (field)

  • 클래스의 특징(속성)을 나타내는 변수
  • 객체의 속성값
  • ex) int age = 30;

2. 메서드 (method)

  • 클래스가 지니고 있는 기능(함수)
  • 클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 한다.
  • ex) void working() {...}

필드 VS 지역 변수(local variable)

  • 지역 변수 : 메서드에 포함된 변수로 스택 메모리에 생성됨
  • 필드 : 클래스의 중괄호 안에 선언된 변수로 힙 메모리의 객체 내부에 생성

스택 메모리에 저장되는 변수는 때가 되면 가비지 컬렉터가 자동으로 삭제하지만, 힙 메모리의 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않는다.

스택 메모리의 변수는 자신이 선언된 메서드의 중괄호가 닫혀 메서드가 종료되면, 그 메서드 안에 선언된 모든 지역 변수가 메모리에서 통째로 삭제된다.

또 다른 차이점은 초깃값이다. 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 힙 메모리에 위치하는 필드는 강제로 초기화되고, 스택 메모리는 강제로 초기화되지 않는다. 따라서 필드는 초깃값을 따로 지정하지 않아도 되지만, 지역 변수는 초깃값을 설정하지 않으면 에러를 발생한다.

3. 생성자 (constructor)

  • 클래스의 객체를 생성 (인스턴스화 - instantiation)
  • 인스턴스화로 만들어진 객체 = 인스턴스 (instance)
  • 반드시 클래스명과 동일해야 한다.
  • 리턴타입이 없다.
  • 컴파일러가 기본 생성자를 추가해 줬기 때문에 직접 만들지 않아도 된다.
  • ex) 클래스명 () {...}

4. 이너 클래스 (inner class)

  • 클래스의 내부에도 클래스가 포함될 수 있다.

클래스는 바로 사용할 수 없고 반드시 객체를 생성해 객체 안에 있는 필드, 메서드 및 이너 클래스를 사용해야 한다.

클래스는 인스턴스화되기 전까지는 파일 형태로 하드 드라이브에 저장될 뿐 메모리의 힙 영역을 소모하지 않는다.


객체

객체는 new 키워드로 생성할 수 있다.

A a = new A();

클래스명 참조 변수명 = new 생성자();

참조 변수는 실제 데이터를 저장하는 것이 아니라,
실제 데이터가 있는 힙 메모리의 위칫값을 가리키는 변수를 말한다.

A() 생성자로 만든 객체를 힙 메모리에 넣고, 위칫값을 A타입의 참조 변수 a에 저장하라

클래스 A는 메모리의 클래스 영역, 참조 변수는 스택 영역에 들어간다.
내부 공간에는 실제 데이터(객체)의 위칫값을 저장한다.
생성자로 만들어진 객체는 힙 메모리에 위치하며, 내부에는 클래스의 멤버(필드, 메서드, 이너 클래스)가 위치한다.

하지만 실제 메서드 구현 코드클래스 영역 안에 저장해 놓고, 객체 안에는 메서드 영역의 위치만 가리키고 있다. 그 이유는 1개의 클래스로 만든 모든 객체는 속성(필드)는 달라도 기능(메서드)는 동일하기 때문이다.

예를 들어 자동차 클래스로 빨간색 자동차 객체와 파란색 자동차 객체를 만들면 힙 메모리에 각 객체가 저장되고, 각 개체는 서로 다른 색(속성)을 가지고 있지만 둘 다 기능(메서드)는 동일하다.

즉, 객체를 1000개 만들어도 메서드는 한 번만 만들면 된다.

생성된 객체에서 필드값은 실제 저장 공간이 객체 내부에 있고, 메서드는 메서드 영역에 있는 하나의 메서드를 공유하고 있다.

자바에서는 힙 메모리에 직접 접근할 수 없어서, 위치 정보를 포함하고 있는 참조 변수를 이용해서만 객체에 접근할 수 있다.

profile
HeeYun's programming study

0개의 댓글