관리 메뉴

나만을 위한 블로그

[JAVA] 클래스란? 객체란? 본문

JAVA

[JAVA] 클래스란? 객체란?

참깨빵위에참깨빵_ 2020. 12. 19. 03:13
728x90
반응형

메서드에 이어 이번 포스팅에선 자바로 프로그래밍할 경우 빼먹을 수 없는 요소인 클래스에 대해 기록하려 한다.

먼저 클래스의 사전적 의미는 아래와 같다.

 

Class : 학급, 반, 수업, 수업

 

학창시절 1학년 5반, 2학년 4반처럼 5반, 4반을 클래스라고 한다. 즉 5반이란 속성을 가진 사람은 5반이라는 클래스에 모여 있고, 4반이란 속성을 가진 사람은 4반에 모여있다고 볼 수 있다.

그럼 자바에서는 왜 이 클래스라는 단어를 가져와서 사용하는 걸까? 아래는 영문 위키백과의 내용이다.

 

객체 지향 프로그래밍에서 클래스는 객체를 만들기 위한 확장 가능한 코드 템플릿이며, 상태(멤버 변수) 및 동작(멤버 함수 or 메서드) 구현에 대한 초기값을 제공한다. 많은 언어에서 클래스명은 클래스의 이름(템플릿 자체), 클래스의 기본 생성자(객체를 생성하는 서브 루틴)의 이름 및 클래스를 인스턴스화해서 생성된 객체의 유형으로 사용된다.
클래스의 생성자에 의해 객체가 생성되면, 결과 객체를 클래스의 인스턴스라고 하고 객체의 특정 멤버변수를 인스턴스 변수라고 한다. 이는 클래스에서 공유되는 클래스 변수와 대조된다. 

 

위의 두 줄이 클래스의 핵심적인 내용이다. 클래스는 객체란 걸 만들기 위한 확장 가능한 템플릿이고, 변수와 메서드 구현에 대한 초기값을 제공한다.

확장 가능하다는 건 무슨 뜻일까? 확장은 범위, 규모, 세력을 늘려서 넓힌다는 뜻이다. 즉 클래스는 처음 설정한 때 뿐 아니라, 나중에라도 변수와 메서드를 추가/삭제할 수 있다는 뜻이다.

 

그럼 간단한 예시를 통해 클래스를 확인해보자.

 

public class Body
{
    public String arm;
    public String leg;
    public String eye;
    public String ear;

    public void listen()
    {
        System.out.println("듣는 중");
    }

    public void see()
    {
        System.out.println("보는 중");
    }

    public void grab()
    {
        System.out.println("잡았다");
    }

    public void walk()
    {
        System.out.println("걷는다");
    }

}

 

이해를 돕기 위해 간단하게 구조만 짰다.

여기서 arm, leg, eye, ear는 Body 클래스가 가진 속성이다. 그 아래의 4개의 메서드는 Body 클래스가 수행할 수 있는 행동이다.

그럼 이 클래스는 어떻게 사용할까? Main이란 클래스를 만들고 여기서 Body 클래스를 사용해보겠다.

 

public class Main
{
    public static void main(String[] args)
    {
        Body
    }
}

 

Body를 써야 하니까 이렇게 선언해봤다. 그런데 아무것도 나오지 않는다.

???? 아니 Body 클래스 쓸 거라서 메인 메서드를 만들고 그 안에 Body를 썼는데, 왜 쓸 수 없는 건가?

여기서 다른 개념이 튀어나온다. 바로 객체다.

 

그럼 객체란 뭘까? 객체의 사전적 의미는 아래와 같다.

 

객체 : 의사나 행위가 미치는 대상, 문장 내에서 동사의 행위가 미치는 대상, 작용의 대상이 되는 쪽

 

그러니까 뭔가를 당하는 쪽이라는 뉘앙스가 있단 건 알겠다. 그런데 이것만으론 궁금증이 해소되지 않는다. 그래서 객체란 뭘까?

영문/한글 위키백과에선 객체를 아래와 같이 설명하고 있다.

 

객체는 변수, 데이터 구조, 함수, 메서드가 될 수 있으며 식별자가 참조하는 메모리의 값이다. 객체는 변수, 함수, 데이터 구조의 조합이 될 수 있다...(중략)...객체는 다형성, 상속이 추가된 추상 데이터 유형이다. 객체에는 상태(데이터)와 동작(코드)가 있다. 온라인 쇼핑 시스템에는 쇼핑 카트, 고객, 제품 같은 객체가 있다. 그리고 주문, 결제, 할인 제공 같은 동작을 지원한다.
객체 또는 오브젝트(Object)는 클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것으로, 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료구조, 함수, 메서드가 될 수 있다.
프로그래밍 언어는 변수를 이용해 객체에 접근하므로 객체와 변수란 용어는 종종 함께 사용된다. 그러나 메모리가 할당되기 전까지 객체는 존재하지 않는다. 객체 지향 프로그래밍에서 객체는 클래스의 인스턴스다.

 

식별자가 참조하는 어쩌고같은 어려운 소리는 집어치우고, 상태(데이터)와 동작(코드)가 있다는 부분이 중요하다.

객체는 클래스를 기반으로 생성된다. A클래스에 변수, 메서드 등을 정의한 다음 메인 메서드 혹은 다른 B클래스에서 A클래스의 객체를 만들어야 A클래스에 정의된 변수와 메서드를 쓸 수 있다.

아래는 이것의 예시를 보여주는 간단한 코드다.

 

public class Main
{
    public static void main(String[] args)
    {
        // Body 클래스의 객체 생성
        Body body = new Body();
        
        // 객체를 통해 Body 클래스의 속성에 값을 집어넣는다
        body.arm = "팔";
        body.ear = "귀";
        body.eye = "눈";
        body.leg = "다리";
        System.out.println("arm = " + body.arm + ", ear = " + body.ear + ", eye = " + body.eye +
                ", leg = " + body.leg);
        
        // 객체를 통해 Body 클래스의 메서드를 호출해 작동하도록 지시한다
        body.see();
        body.grab();
        body.listen();
        body.walk();
    }
}

 

클래스의 객체를 생성하는 방법은 메인 메서드 안의 첫 줄처럼 하면 된다.

객체를 만들고자 하는 클래스의 이름을 쓰고(Body) 객체로 쓸 변수의 이름(body)을 지정한 뒤, new Body();를 통해 객체를 만든다. 그리고 만들어진 객체를 변수에 대입해서 Body 클래스의 객체를 만든다.

객체를 만들었으니 이제 Body 클래스에 선언했던 변수, 메서드들을 메인 클래스에서 불러다 쓰거나 값을 넣을 수 있다.

위의 예시를 실행하면 아래의 결과가 콘솔에 출력된다.

 

 

Body 클래스로 돌아가보면 각 변수들을 초기화하지 않고 그냥 선언만 했다. 그리고 메인 메서드 안에서 각 변수에 값을 할당한 다음 println()으로 찍어보니, Body 클래스의 변수에 무사히 들어가진 것을 확인할 수 있었다. 메서드도 제대로 작동한다.

 

주의할 것은 Body 클래스에서 변수나 메서드 중 하나의 접근제어자를 private로 선언하면 Main 클래스에선 그것을 사용할 수 없다. 이유는 정말 간단하니 만약 모른다면 접근제어자를 검색해서 공부하면 된다.

반응형
Comments