주인장의 프로그래밍 개발 공부방

[자바 프로그래밍 기본] 1. 클래스와 객체 본문

Java/자바 프로그래밍 기본

[자바 프로그래밍 기본] 1. 클래스와 객체

거신 2022. 12. 19. 03:52

우리가 이전 글에서 객체지향이 무엇을 의미하는지와 장단점에 대해서 알아봤고
마지막에서 객체지향이 지니고 있다는 특징 4가지를 포장지를 뜯진 않고 껍데기만 잠깐 살펴봤었다.
이번 시간에는 그 4가지 중에서 하나를 가져와 포장을 뜯어서 내용물을 확인"해 보려고" 했지만
그 포장지를 뜯기 위해선 먼저 진행해야 할 선행 퀘스트가 있어서 일단 그 퀘스트부터 처리하고자 한다.

목표 : 클래스와 객체에 대해서 정확하게 구분하고 각각의 의미를 이해할 수 있다.

클래스를 이용해 객체를 생성하는 방법을 알 수 있다.

1. 클래스와 객체

객체지향에 대해서 알아보면서 우리는 객체(Object)가 어떤 존재인지 간단하게 알아봤는데

객체를 볼펜을 구성하고 있는 각각의 부품이라고 했었다.
그리고 그 객체들을 뚝딱뚝딱 조립하여 하나의 프로그램으로 만드는 것을

객체지향 프로그래밍이라고 했다.

 

그렇다면 이제 우리는 그 볼펜 부품을 만들어 내는 존재에 대해서 알아보도록 하자.

당연하게도 부품이라는 게 하늘에서 뚝 떨어지는 게 아니라면

분명 그 부품을 만들어 내는 무언가가 존재할 것이다.

 

자바에서는 그 존재가 바로 클래스(Class)라는 존재이다.

처음 듣는 이름이라서 조금 생소할 수도 있겠지만

의외로 클래스는 자바를 공부하는 우리들의 곁에 항상 같이 있는 녀석이기도 하다.

잠깐 머리도 식힐 겸 자바 프로그램의 시작점인 main 함수를 작성해 보자.

 

예시 1)

public class Test {
    public static void main(String[] args) {
    	System.out.println("Hello World!");
    }
}

우리가 자바로 맨 처음에 소스 코드를 작성하면 예시 1)과 같이 맨 처음 작성할 것이다.

이 소스를 작성하기 위해서 여러분들은

자바 프로젝트를 생성하고 소스 폴더 안에 패키지를 만들고

Test.java 파일을 만들기 위해 새로 만들기로 "Java 클래스"를 만들었을 것이다.

여기에서 클래스가 우리가 지금 알아보려는 클래스와 동일한 녀석이다.

 

예시 1)의 소스 코드에서도 볼 수 있듯이

바로 public "class" Test와 같이 클래스는 우리와 항상 함께 하고 있는 것이다.

이와 같이 Test.java파일을 생성하는 동작을 우리는 클래스를 생성한다라고 표현한다.

 

자 그러면 클래스가

우리의 자바 프로젝트 안에!

우리의 가슴속에!

하나가 되어 살아가고 있다!

는 건 알겠는데 그렇다면 걔가 무슨 역할을 하는 녀석인지 찬찬히 살펴보도록 하자.

 

2. 클래스(Class)

 

간단하게 클래스를 한 마디로 표현하자면

객체의 설계도이다.

그러니까 클래스가 있어야만 객체가 만들어질 수 있는 것이다.

클래스에 대한 정보를 찾아보거나 어딘가에서 설명을 들었거나 했을 때

무조건 한 번쯤은 봤을 비유가 바로바로 붕어빵과 붕어빵 일 것이다.

간단하게 생각하면 가장 설명하기 쉬운 비유라고 생각하지만

내 생각엔 붕어빵과 붕어빵 틀의 관계로는 클래스를 설명한다는 게

뭔가 채울 수 없는 부분이 존재한다고 생각하기에

나는 역시 킹나미 갓펜을 가지고 설명하도록 하겠다.

(사실 힙스터라서 남들이 하는 대로 똑같이 하기 싫은 건 함정)

 

클래스가 객체의 설계도라고 했으니

다시 말해, 클래스는 볼펜 부품의 설계도인 셈이다.

 

그림 1)

여기 볼펜심이 하나 있다.

간단하게 생긴 볼펜심이라도 이걸 만들어내기 위해선

 

심의 길이는 얼마나 되어야 하고,

잉크를 채워 넣는 부분은 어떤 형태로 만들어야 하며,

잉크는 얼마나 넣고,

볼펜 촉은 또 어떤 모양으로 생겼으며,

잉크는 어떤 방식으로 뽑아내는지 등과 같이

다양한 요소들이 설계되어야 한다.

그리고 그 설계를 토대로 하나의 볼펜심이 만들어지는 것이다.

반대로 이런 설계 없이는 볼펜심을 만드는 것은 불가능하다.

 

즉, 객체를 생성하기 위해서 꼭 필요한 존재가 바로

객체의 설계내용을 담고 있는 클래스인 것이다.

객체클래스가 있어야 만들어낼 수 있고

그 클래스 안에는 볼펜심의 길이잉크의 양, 잉크를 뽑아내는 방식 등과 같이

객체각종 정보, 할 수 있는 기능 등이 포함되어 있는 것이다.

 

여기에서 간단하게 코드 형태로 한 번 알아보자.

 

예시 2)

class 볼펜심_설계도 {
    int 볼펜심_길이;
    String 볼펜심_형태;
    int 볼펜심_둘레;
    String 볼펜촉_모양;
    Color 잉크색;
    int 잉크양;

    public void 잉크를_뽑아냄() {
        
    }
}

간단하게 볼펜심을 만들 수 있는 클래스를 작성해 보았다.

이 클래스 안에는 두 가지 형태로 구성되어 있다는 것을 알 수 있을 텐데

볼펜심_길이, 볼펜심_형태, 잉크색과 같이 변수로 되어 있는 항목들과

잉크를_뽑아냄과 같이 함수로 되어 있는 항목들이 있다.

이런 변수와 함수가 객체의 내용을 구성해서 하나의 객체를 생성할 수 있게 되는 것이다.

 

그렇다면 클래스가 대충 어떤 것이며, 어떤 역할을 하며,

무엇으로 구성되어 있는지 알아봤으니

이제는 직접 객체를 생성하는 방법에 대해서 알아보도록 하자.

설계도를 어느 정도 읽을 줄 알게 되었으니

그 설계도를 이용해 해당 물건을 찍어낼 수 있는 기계를 사용해보자는 말이다.

 

3. new 연산자와 인스턴스

 

자! 설계도를 읽을 줄 알게 되었으니(만드는 방법은 나중에 더 상세하게)

이제 이 설계도를 이용해 물건을 찍어낼 수 있는 기계를 한 번 사용해보자.

볼펜심 설계도를 가지고 있더라도

그에 맞는 재료와 가공할 수 있는 기계가 없다면

볼펜심을 만드는 것은 불가능할 것이다.

 

그래서 자바에서는 당신이 설계도만 가지고 있다면

객체를 만들 수 있도록 재료와 가공할 수 있는 기계를 제공해주고 있다.

그것이 바로 new 연산자이다.

 

예시 3)

볼펜심_설계도 검은색_볼펜심 = new 볼펜심_설계도();

예시 3)과 같이 new 연산자를 이용해서 검은색_볼펜심이라는 객체를 하나 생성하였다.

복잡한 표현 없이 간단하게 new 클래스명()으로 객체를 만들 수 있다.

그리고 우리는 이를 클래스의 인스턴스를 생성한다고 표현한다.

아니 방금 전까지 new 연산자를 이용해서 객체를 생성했다고 했는데

뜬금없이 인스턴스를 생성했다니? 인스턴스는 또 뭔데?

그렇다면 객체인스턴스는 똑같은 말인가?

엄연히 따지면 세세한 부분에서 둘은 다른 단어이다.

 

어딘가에선 둘을 혼용해서 설명할 수도 있다고 생각하는데

적어도 여기에서는 둘을 구분해서 좀 더 정확한 의미로 여러분들에게 전달하고자 한다.

 

객체인스턴스클래스를 이용해 생성한 것들을 말한다.

이렇게만 본다면 객체인스턴스는 동일한 단어라고 생각할 수 있지만

여기에는 표현의 방법이 숨겨져 있다.

 

예시 3)에서 만든 검은색_볼펜심을 가지고 알아보자면

검은색_볼펜심객체이다.

그리고 검은색_볼펜심볼펜심_설계도인스턴스이다.

여기에서 차이를 느낄 수 있겠는가?

바로 클래스와의 관계성의 포함 유무에 따라서 표현하는 방법이 달라지는 것이다.

검은색_볼펜심 자체만 가지고 말한다면 객체라고 표현할 수 있다.

그리고 검은색_볼펜심볼펜심_설계도와의 관계를 따진다면

검은색_볼펜심볼펜심_설계도인스턴스라고 표현한다.

 

그럼에도 객체인스턴스를 혼용해서 사용한다고 해서 의미가 크게 달라지는 것이 아니기에

딱히 혼용한다고 해서 그것이 잘못되었다고 말을 할 수는 없겠지만

적어도 필자가 여기에서 작성할 때에는

확실하게 구분해서 작성하도록 노력하겠다.

 

4. 정리

 

우리가 객체지향에 대해서 알아보면서 객체지향에서 핵심인 객체(Object)에 대해서 알아봤고

객체를 생성하는데 필요한 클래스에 대해서 자세하게 알아봤다.

클래스객체의 설계도라고 표현했는데

그 단어 의미대로 객체를 생성할 때 필요한 요소들을 포함하고 있고

이는 자바에서 변수함수로 표현하고 있다.

그리고 객체를 생성하기 위해서는 new 연산자가 필요한데

new 클래스명()을 이용해서 객체를 생성할 수 있다.

그리고 new 연산자를 이용해서 객체를 생성하는 것을

자바에서는 인스턴스를 생성한다라고 표현한다.

객체인스턴스는 큰 의미로는 같은 의미로 사용될 수 있지만

클래스와의 관계에 따라서 둘을 명확하게 구분해서 표현할 수 있다.

Comments