6-5 인스턴스 멤버와 정적 멤버

Cloudman·2022년 11월 24일
0

항해99 자바 공부

목록 보기
6/10

★ 진행과정 ★

  • 클래스 (6 챕터)
    ◎ 스터디 그룹으로 진행
    ▷ 6-1 : 객체 지향 프로그래밍
    ▷ 6-2 : 필드
    ▷ 6-3 : 생성자
    ▷ 6-4 : 메소드
    ▶ 6-5 : 인스턴스 멤버와 정적 멤버
    ▷ 6-6 : 패키지와 접근 제한자



📒 인스턴스 멤버와 정적 멤버

모든 객체의 필드값을 객체마다 가지고 있을 필요가 있을까 라는 생각을 가지고 보자.
자바는 이런 경우를 위해 클래스 멤버를 인스턴스 멤버와 정적 멤버로 구분해서 선언할 수 있다.
인스턴스 멤버는 객체마다 가지고 있는 멤버를 말하고, 정적 멤버는 클래스 위치시키고 객체들이 공유하는 멤버를 말한다.



📋 인스턴스 멤버와 this

인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부른다.


🔖 인스턴스 멤버 선언

인스턴스 필드와 메소드를 선언하는 방법은 지금까지 학습했던 내용과 다르지 않다.

아래는 인스턴스 필드 gas, 인스턴스 메소드 setSpeed() 를 선언한 것이다.

gas 필드setSpeed() 메소드인스턴스 멤버이다.
그래서 외부 클래스에서 사용하기 위해서는 Car 객체(인스턴스) 를 생성하고 참조 변수 myCar 또는 yourCar 로 접근해야 한다.

위에 대한 내용을 그림을 표현하면 아래와 같이 된다.




🔖 this

객체 내부에서 인스턴스 멤버에 접근하기 위해서 this 를 사용할 수 있다.
예로 this.animal 은 자신이 가지고 있는 animal 필드 라는 뜻이 된다.
this 는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용된다.

아래처럼 직접 한번씩 해보면서 이해하자...




📋 정적 멤버와 static

static고정된 이란 의미이다. 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.


🔖 정적 멤버 선언

정적 필드와 정적 메소드를 선언하려면 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.
필드를 선언할 때는 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로, 그러할 필요가 없을 경우라면 정적 필드로 선언하는 것이 좋다.

public class 클래스 {
	// 정적 필드
    static 타입 필드 [= 초기값];
    
    // 정적 메소드
    static 리턴 타입 메소드( 매개변수선언, ... ) { ... }
}

그에 관한것은 계산기가 아주 좋은 예시가 된다.

public class Calculator {
	String color;				// 계산기 종류별 색이 다를수 있다
    static double pi = 3.14159; // 계산기에서 사용하는 파이 값은 동일하다.
}

이는 메소드 역시 동일하다.
인스턴스 필드를 포함하고 있다면 인스턴스 메소드로 선언,
포함하지 않고 있다면 정적 메소드로 선언하는 것이 좋다.

public class Calculator {
	String color;											// 인스턴스 필드
    void setColor(String color) { this.color = color; }		// 인스턴스 메소드
    static int plus(int x, int y) { return x + y; }			// 정적 메소드
    static int minus(int x, int y) { return x - y; }		// 정적 메소드
}




🔖 정적 멤버 사용

클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근한다.


또한 객체 참조 변수로도 접근이 가능하다 !!

다만 정적 요소는 클래스 이름으로 접근하는 것이 좋다.




🔖 정적 메소드 사용시 주의

객체가 없어도 실행된다는 특징이 있어 정적 메소드를 선언할 때 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.

또한, 위처럼 객체 자신의 참조인 this 키워드도 사용이 불가능하다.

하지만 위처럼 객체를 먼저 생성하고 참조 변수로 접근하면 가능은 하다.




📋 싱글톤

전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우도 있다. 이럴 때 단 하나만 생성 된다고 해서 이 객체를 말하는 것이다.
이 때는 new 연산자를 통한 생성자 호출을 막기 위해 접근 제한자를 지금껏 쓰던 public 이 아닌 private 를 붙여줘야 한다.

위처럼 해도 클래스 내부에서는 new 연산자로 생성자 호출이 가능하긴 하다.

외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법 뿐이다.

메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드처럼 해도 변수1변수2는 동일한 객체를 참조한다.

클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();

위에서 만든 코드를 이어서 이제 메인문에서 활용해보면

기존의 참조 방식으로는 객체를 생성할 수가 없으며,
== 를 통해 비교해본 결과 같은 객체인 것을 알 수 있다.




📋 final 필드와 상수


🔖 final 필드

final최종적이란 의미이다.
이는 final 필드는 초기값이 저장되면 이것을 프로그램 실행 도중에 수정이 불가능하다는 의미이다.

final 타입 필드 [= 초기값]; 이러한 형태로 선언한다.

final 필드에 초기값을 주는 방법은 두가지 뿐이다.

  1. 필드 선언시에 주는 방법
  2. 생성자에서 주는 방법

이 두가지 밖에 없다. 단순 값이라면 필드 선언시에 주는것이 간단하지만 복잡한 초기화 코드가 필요하거나,
객체 생성 시에 외부 데이터로 초기화 해야 한다면 생성자에서 초기값을 지정해 줘야 한다.
만약 초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다.

위처럼 하고 난 후 결과값을 확인해보자.




🔖 상수

일반적으로 불변의 값을 상수(static final) 이라고 한다.
final 필드는 한 번 초기화 되면 수정할 수 없는 필드
하지만, final 필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있다.
하지만 static 이면서 final 인 상수 즉, static final 필드 는 객체마다 존재하지 않고 클래스에만 존재한다.
따라서 한번 초기값이 저장되면 변경이 불가능하다.

static final 타입 상수 = 초기값;

이에 대한 예시가 몇가지 있다.

static final double PI = 3.14159;
static final double EARTH_RADIUS = 6400;

아래처럼 상수를 선언해서 사용이 가능하다 !!




🔗 핵심 정리

  • 인스턴스 멤버 : 인스턴스 멤버란 객체(인스턴스) 를 생성한 후 사용할 수 있는 필드, 인스턴스 메소드를 말한다.
  • this : 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this 를 사용할 수 있다.
    this.model 은 자신이 가지고 있는 model 필드라는 뜻입니다.
    this 는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 할 때 사용된다.
  • 정적 멤버 : 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
    이를 각각 정적 필드, 정적 메소드 라고 한다.
  • static : 정적 멤버를 선언할 때 사용하는 키워드 이다.
  • 싱글톤 : 전체 프로그램에서 단 하나의 객체만 만들도록 해야하는 경우 단 하나만 생성되는 객체를 말한다.
  • final 필드 : 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 필드를 말한다.
  • 상수 : 불변의 값들을 저장하는 필드를 말한다. final static 키워드를 통해 선언한다.
profile
코린이

0개의 댓글