안녕하세요.
이번 글에서는 클래스와 객체에대해서 알아보도록하겠습니다.
다음 순서에 맞춰서 내용이 진행되니 필요하신 부분을 찾아서 읽으시는 것을 추천합니다!
순서
1. 객체와 클래스
2. 객체와 인스턴스
3. 객체의 구성요소
4. 인스턴스의 생성과 사용
5. 프로그래밍 관점에서의 클래스의 정의와 의미
1. 객체와 클래스
지난 글에서 객체지향에다루면서 객체에 관한 언급을 했었습니다. 과연 객체란 무엇일까요??
객체의 사전적 정의는 '실세계에 존재하거나 생각할 수 있는 것'입니다.
컴퓨터, 스마트폰과 같은 우리가 주변에서 볼 수 있는 사물들과 함께 개념이나 논리 같은 무형적인 것들까지 객체라고 할 수 있습니다.
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 의미합니다.
그렇다면 클래스는 무엇일까요?
쉽게 말해서 '객체를 정의해놓은 것' 입니다. 흔히 class를 객체라고 생각하기 쉬운데 class는 객체를 만들기위한 설계도 같은 개념입니다.
이 전 글에서 말한 객체지향의 가장 큰 장점인 '코드의 재사용성이 높고 유지보수가 용이하다'는 클래스가 있기에 가능한 것입니다.
클래스를 잘 만들어놓으면 이를 이용해서 객체를 만들어낼 수 있습니다. 예를 들면, 우리가 DIY가구를 사서 조립을 할 때, 설계도가 있면 더 쉽게 만들 수 있고 여러번 만들때도 매번 고민하지않고 설계도대로 만들 수 있습니다.
또한, 소스코드의 관심사를 분리해서 클래스를 만들면 특정 관심사에 변화가 생겼을 때, 관련된 부분의 클래스만 수정하면, 이를 사용하는 모든 객체들을 수정한 효과를 얻을 수 있습니다.
이처럼 클래스를 한 번 잘 만들어놓으면, 매번 객체를 생성할 때마다 어떻게 객체를 만들어야할지 고민하지않고 클래스로부터 객체를 생성해서 사용할 수 있습니다. 이때 new라는 명령어를 사용해서 클래스로부터 객체를 만들 수 있습니다.
2. 객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고합니다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고합니다.
사실 인스턴스는 객체와 의미를 가집니다. 하지만, 객체는 모든 인스턴스를 대표하는 포괄적인 이미지를 가집니다. 그에비해 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 더 구체적인 의미를 가지고있습니다.
예를들면, 제품의 품번, 이름, 가격을 담고있는 클래스를 이용해서 객체를 만들 때, '제품은 인스턴스다'라고하는 것보다 '제품은 객체다'라는 것이 자연스럽고, '제품은 제품 클래스의 객체다'라고하는 것보다 '제품은 제품 클래스의 인스턴스다'라고 하는 것이 더 자연스럽습니다.
엄격하게 구분해서 사용할 필요는 없지만, 상황에 맞게 구분해서 사용하는 것이 좋습니다.
그렇다면, 객체는 어떤 요소들로 이루어져있을까요?
3. 객체의 구성요소
객체는 속성과 기능 두가지 요소로 이루어져있습니다. 일반적으로 객체는 많은 기능과 속성을 가지고있습니다. 따라서, 객체는 속성과 기능의 집합이라고도 할 수 있습니다. 그리고 우리는 이 속성과 기능을 '객체의 멤버'라고 합니다. 추후에 사용할 멤버변수 와 같은 용어들에도 사용되니 꼭 기억해주세요!
클래스란 객체를 정의한 것이기때문에, 클래스에는 속성과 기능이 정의되어있습니다. 이후의 내용과 게시글에서는 객체에 관한 내용을 말할 때, 속성 = '멤버변수', 기능 = '메서드'로 사용하겠습니다.
멤버변수 클래서스에 정의되어 있는 변수입니다. 멤버변수의 특징에 맞게 int, float, boolean, String 등의 변수의 자료형을 선택해서 선언해야합니다.
메서드 역시 특징에 맞게 return 타입 등을 고려해서 사용해야합니다.
클래스에서 선언한 멤버변수와 메서드들은 공개 범위를 가지는데 이는 추후에 설명할 '접근제어자'에서 다루겠습니다.
그렇다면 이런 멤버변수와 메서드를 가지는 클래스의 인스턴스를 어떻게 생성하고 사용할까요?
4. 인스턴스의 생성과 사용
클래스로부터 인스턴스를 생성하는 방법은 여러가지가 있지만 이번 글에서는 가장 일반적으로 사용하는 방법을 소개하겠습니다.
아래와 같이 정의된 클래스를 사용하겠습니다.
class Product{
//Product의 멤버변수
String name;
int price;
String maker;
int stock;
//Product의 메소드
void changePrice();
void changeStock();
}
제일 먼저 클래스의 객체를 참조하기위해서 참조변수를 선언합니다.
ex) Product product;
Product 클래스 타입의 참조변수 product를 선언했습니다. 위의 예시와 같이 선언을하면 메모리에 참조변수 product를 위한 공간이 마련됩니다.
클래스의 인스턴스를 생성 후, 인스턴스의 주소를 참조변수에 저장합니다.
ex) product = new Product();
여기서 인스턴스를 생성할 때, new 뒤에 나오는 것이 바로 클래스에 정의되어있는 생성자입니다.
new에 의해서 Product 클래스의 인스턴스가 메모리의 빈 공간에 생성됩니다. 클래스에 있는 멤버변수와 메서드의 자료형의 크기에 따라서 메모리가 할당됩니다.
그 다음에 대입연산자(=)에 의해서 참조변수 product에 생성된 객체의 주소값이 저장됩니다. 이렇게하면 참조변수 product를 이용해서 Product 인스턴스에 접근할 수 있습니다. 이를 참조변수가 인스턴스를 '가리키고있다' 혹은 '참조하고 있다'라고 합니다.



하지만 1개의 참조변수로 여러개의 인스턴스를 참조하는 것은 불가능합니다.

이처럼 인스턴스는 참조변수를 통해서만 다룰 수 있고 그렇기 때문에 참조변수의 타입은 인스턴스의 타입과 일치해야합니다.
5. 프로그래밍 관점에서의 클래스의 정의와 의미
클래스 - 데이터와 함수의 결합
위를 이해하기위해서는 프로그래밍 언어에서 데이터 처리를 위한 데이터 저장형태에대해서 알아야합니다.

변수 - 하나의 데이터를 저장할 수 있는 공간
배열 - 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
구조체 - 서로 관련된 여러 데이터를 자료형에 관계없이 하나의 집합으로 저장 할 수 있는 공간
클래스 - 데이터와 함수의 결합 ( 구조체 + 함수)
이와 같이 클래스는 변수와 함수를 하나의 클래서에 정의해서 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있다는 프로그래밍적인 의의가 있습니다.
거기에 추가적으로 프로그래밍언어에서 제공하는 사용자정의 타입(User-defined type)을 클래스를 이용해서 정의할 수 있습니다. 사용자정의 타입이란 기본적으로 제공하는 자료형 이외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 추가하는 것을 의미합니다. 자바에서는 이를 클래스를 이용합니다.
이렇게 사용자정의 타입으로 데이터와 함수를 묶어서 사용하면 관심사의 분리 및 코드의 재사용성과 편리한 유지보수를 할 수 있게 도와줍니다.
다음 글에서는 자바에서 사용하는 변수와 메서드에대해서 알아보겠습니다.
글 읽어주셔서 감사합니다!
'개발자 면접 질문' 카테고리의 다른 글
WAS와 WS의 차이점과 역할: 백엔드 개발의 필수 개념 (0) | 2025.01.31 |
---|---|
[Spring] DI와bean (0) | 2025.01.30 |
[SPRING] 환경 설정 및 웹 개발 기초 (0) | 2025.01.29 |
JAVA - 객체지향이란? (0) | 2025.01.29 |
개발자 면접 질문- 운영체제 기초 (0) | 2025.01.27 |
댓글