같은 개념 다른 용어?

maketheworldwise·2022년 3월 25일
0


이 글의 목적?

매번 블로그나 레퍼런스를 참고할 때마다 분명 같은 의미를 가지는데 각 블로그마다 다른 용어를 사용하는 경우가 굉장히 많았다. 각 용어별로 차이가 있는 걸까?

필드 vs 속성

함수 vs 메소드

객체 지향 프로그래밍과 항상 비교되는 것은 절차적/구조적 프로그래밍이다. 절차적/구조적 프로그래밍은 공유 변수를 필드라고 말하고 기능적 요소를 함수라고 한다. 객체 지향 프로그래밍에서는 같은 일을 하지만 이름을 그대로 따라쓰니 차별화가 되지 않는 것 같다고 하여 전역 변수를 프로퍼티라 부르고, 함수를 메소드라고 부르기 시작했다고 한다.

정리하자면 다음과 같다.

  • 필드 = 속성 = 프로퍼티
  • 함수 = 메소드

책에 따르면, 객체 지향에서 필드는 객체 변수, 정적 변수를 의미하고, 속성은 Getter/Setter와 같이 필드를 외부에 노출시키는 것을 메소드라고 하는 사람이 있다고 한다.

클래스 vs 객체 vs 인스턴스

책에서는 클래스와 객체의 관계를 절대로 붕어빵틀과 붕어빵의 관계로 보아선 안된다고 했다.

// 붕어빵틀을 만들었는데 붕어빵이 나왔다? 논리에 맞지 않음
붕어빵틀 붕어빵 = new 붕어빵틀();

클래스와 객체의 차이는 다음과 같다.

  • 클래스 : 분류, 집합, 같은 속성과 기능을 가진 객체를 총칭하는 개념 (사람, 펭귄)
  • 객체 : 세상에 존재하는 유일무이한 사물 (김연아, 뽀로로)

가장 단순하게 차이를 확인하는 방법으로는 나이를 물어보고 대답을 할 수 있느냐 없느냐로 판단하는 것이라고 했다.

  • 사람의 나이는 몇 살인가?
  • 펭귄의 나이는 몇 살인가?
  • 김연아의 나이는 몇 살인가?
  • 뽀로로의 나이는 몇 살인가?

그렇다면 인스턴스는 무엇일까? 🤔

클래스는 영어로 class, 객체는 영어로 object라고 한다. 즉, class로 object를 만들었다는 의미가 되는데, object라는 표현보다는 클래스의 인스턴스라는 표현을 사용한다.

클래스 멤버 vs 객체 멤버

static 멤버 vs 인스턴스 멤버

하단의 예제로 클래스 멤버와 객체 멤버가 무엇인지 살펴보자.

public class Mouse {
	public String name;
    public static int countOfTail;
}
public class MyMouse {
	public static void main(String[] args) {
    	Mouse.countOfTail = 1;		// 1
        							// 클래스 멤버 속성

        Mouse jerry = new Mouse();	// 2
        jerry.name = "jerry";		// 객체 멤버 속성
        jerry.countOfTail = 1;		// 클래스 멤버 속성
    }
}

static 키워드가 붙은 속성을 클래스 멤버 속성이라고 하고, static 키워드가 붙지 않은 속성은 객체 멤버 속성이라한다. 메소드도 동일하게 static이 붙은 메소드를 클래스 멤버 메소드라 하고, static 키워드가 붙지 않은 속성을 객체 멤버 메소드라고 한다.

즉, 클래스 멤버는 static이 붙은 속성, static이 붙은 메소드를 의미하고, 객체 멤버는 static이 안붙은 속성, static이 안붙은 메소드를 의미한다.

클래스 멤버는 T 메모리 구조에서 스태틱 영역에 상주하게되어 static/정적 멤버라고 하며 객체 멤버는 객체가 클래스의 인스턴스이므로 인스턴스 멤버라고 한다.

  • 클래스 멤버 = static 키워드가 붙은 녀석들 = static 멤버 = 정적 멤버 (더 많이 사용)
  • 객체 멤버 = static 키워드가 안붙은 녀석들 = 인스턴스 멤버

💡 정적 멤버의 특징?

정적 멤버 속성은 클래스의 모든 객체들이 같은 값을 가질 때 사용하는 것이 정석이다. 대표적으로 사람 클래스의 인구, 고양이 클래스의 다리 개수, 승용차 클래스의 바퀴 개수 등이 있다.

정적 멤버 메소드는 객체들의 존재 여부에 관계 없이 사용할 수 있다. 우리가 흔히 아는 메인 메소드가 대표적인 정적 멤버 메소드다. 실무에서는 클래스의 인스턴스를 만들지 않고 사용하게 되는 유틸리티성 메소드(Math 클래스)를 주로 정적 메소드로 구성한다고 한다.

이 글의 레퍼런스

  • 스프링 입문을 위한 자바 객체 지향의 원리와 이해
profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓

0개의 댓글