느리더라도 꾸준히

[JAVA기본]함수 클래스 객체 인스턴스 본문

Java

[JAVA기본]함수 클래스 객체 인스턴스

테디규 2022. 12. 3. 14:40

1. 문제 상황

자주 사용되는 용어들이지만 명확한 의미를 알지 못하고 사용하니, 문서를 읽을때 문제가 발생하고 있다. 그래서 이번에 조금 정리를 해두려고 한다.

2. 문제 해결

선언(declaration)과 정의(definition)

선언은 컴파일러에게 어떤 대상의 이름을 알려주는 행위이다.

정의는 컴파일러에게 어떤 대상의 실제 내용을 알려주는 행위이다.

public class ClassA {
    int a; // 변수 a를 선언

        //abstract void func(); // 추상메서드로 메서드도 선언( 단 클래스가 추상클래스이여야한다.)

    void func2(){ // func2 정의
        int b = 10;
        System.out.println(b);
    }

    ClassB classB; // 클래스 선언

    public static void main(String[] args) {
        ClassA classA = new ClassA(); // 클래스 생성
        classA.func2();
        System.out.println(classA.a); // 자바는 지역 변수를 제외하고는 자동으로 메모리를 할당하여 초기화해준다.
    }
}

프로그래밍 적으로 선언과 할당을 구분하는 기준으로 “메모리를 할당하는가”로 나누 기도 한다. 근데 자바는 어차피 선언만 하더라도 메모리를 할당해 초기화해주는 경우가 많아서, 메모리 기준보다는 의미적으로 나누는게 맞다고 생각한다.

func2() 의 경우는 선언도 했고 정의도 한거 아닌가 라고 볼 수도 있다. 틀린 말은 아니지만, body쪽을 좀더 구체하게 적고 있기 때문에 정의했다고 표현한다.

이러한 개념을 이해하고, 아래 용어들을 하나씩 이해해보자.

함수

정의

가장 기본적인 기능 단위이며 클래스 내에 존재하면 메소드 라고 부른다.

    void func2(){ // func2 정의
        int b = 10;
        System.out.println(b);
    }

하나이상의 함수와 변수들이 모여서 클래스를 만들수 있다.

클래스

정의

  • 변수와 함수(메서드)들을 포함하는 특정 기능들의 집합이다.
  • 특정 종류의 객체내에 있는 변수와 메서드를 정의하는 역할을 한다.
public class ClassA {
    변수
    변수    
    메서드()
    메서드()
}

예시

사람 클래스가 있다고 하자

  • 변수 : 키, 몸무게
  • 함수 : eat(), sleep()

그리고 OOP의 관점에서 정의한 클래스를 선언하게 되면 객체가 만들어진다.

객체

정의

객체는 소프트웨어 세계에서 구현할 대상을 말합니다.

클래스와 객체의 차이

이 두 개념은 “메모리에 할당하는가?”를 기준으로 나눌 수 있다.

“클래스는 정의한다”

  • “이 클래스에는 기능(메서드)과 변수가 있어요” 라고 규정하는 역할을 할 뿐이다.

“객체는 클래스를 선언 또는 생성해서 만들어진다.”

  • 자바 언어에서 클래스를 선언하면, 프로그램이 실행될때 메모리를 할당하여 초기값이나 자동으로 null 값 넣어준다.
public class ClassA { // 클래스를 정의
        ClassB classB; 
        String name;

    public static void main(String[] args) {
        ClassA classA = new ClassA();
    }
}

정의한 클래스를 이용하여 객체를 생성한다.

이해가 안간다면 아래 인스턴스에서 예시를 구분할 예정이니, 인스턴스까지 보고 다시 보도록 해보자.

아무튼 위에 작성한 내용처럼 프로그램이 실행되는 순간, 객체는 메모리에 올라오게 된다. 이를 인스턴화 했다고 표현한다.

인스턴스

정의

정의된 클래스에 따라 소프트웨어 세계에 구현된 실체이다.

객체와 인스턴스의 차이점

객체는 클래스에 정의된 대로 만들어진 컨셉 또는 개념과 같은 대상을 의미한다. 그러나 인스턴스는 클래스를 통해서 구현한 대상(객체)가 실제로 실체화된 실체를 말한다.

즉 인스턴스는 객체에 포함된다고 볼 수 있다.

예시

예를들어 붕어빵을 만든다고 상황을 가정해보자. 클래스는 붕어빵을 만들기 위한 틀이 되고 객체는 붕어빵이란 컨셉 대상이 된다. 그리고 인스턴스는 붕어빵 틀로 찍어낸 각각의 붕어빵이다.

팥붕어빵과 슈크림붕어빵은 같은 객체라고 할수 있지만, 인스턴스 관점으로 보았을 때는 다르다.

public class ClassA {
    String name;

    public ClassA(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        ClassA tmp1 = new ClassA("팥붕어빵");
        ClassA tmp2 = new ClassA("슈크림붕어빵");

        // 이 둘은 Class A라는 컨셉의 대상이다.
        System.out.println(tmp1 instanceof ClassA); //true
        System.out.println(tmp2 instanceof ClassA); //true

                // 하지만 실체화 된 모습은 다르다.
        System.out.println(tmp1.name); // 팥붕어빵
        System.out.println(tmp2.name); // 슈크림붕어빵
    }
}

참고

https://computer-science-student.tistory.com/319#:~:text=객체란 클래스에 선언,된 구체적인 실체를 말한다.

객체와 인스턴스의 차이

Comments