자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 10일차 - 객체 지향 프로그래밍(인스턴스 멤버와 정적 멤버, 패키지와 접근 제한자)

개발학생 2025. 6. 11. 17:12
반응형

이전 공부글

2025.06.04 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와 인스턴스

 

Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와

1. 객체의 특징객체(Object): 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중, 고유 속성을 가지고 있어 식별 가능한 것-> 속성과 동작[필드(Field)와 메서드(Method)]으로 구성되어 있음현실

keep-programming-study.tistory.com

2025.06.05 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)

 

Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)

1. 필드(Field)1) 필드의 개념 및 선언개념: 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 저장선언: 클래스 중관호 {} 블록 내부에 "타입 필드명( = 초기값);"과 같은 형식으로 선언-

keep-programming-study.tistory.com

 

1. 인스턴스 멤버와 정적 멤버

  • 코드 안정성과 유지보수성을 위하여 객체 중심의 설계를 명확히 하고 메모리 사용 효율을 높이기 위해,
    클래스 멤버를 두 가지로 구분하여 선언
    • 인스턴스 멤버: 객체마다 가지고 있는 멤버로, 객체를 생성한 후 사용 가능한 필드와 메서드를 말함
    • 정적 멤버: 클래스에 위치시키고 객체들이 공유하는 멤버

1) 인스턴스 멤버와 this

  • 인스턴스 멤버인 필드와 메서드는 객체에 소속된 멤버이므로, 객체 없이는 사용 불가 

(1) 인스턴스 멤버 선언 및 사용 예시

인스턴스 멤버 선언 및 사용: 사용 메모리 영역 예시

  • 인스턴스 필드는 객체 단위로 존재하고, 인스턴스 메서드는 클래스에 속하지만 실행할 때는 객체를 통해야 함 
    -> 인스턴스 필드가 사용되면 메서드도 객체 없이 실행 불가
class Car {
  // 인스턴스 필드
  int gas;
  
  // 인스턴스 메서드
  void setSpeed(int speed) { ... }
}

 

*인스턴스 멤버를 외부 클래스에서 사용하는 예시

  • 객체(인스턴스)를 생성하고 참조 변수(예시에선 car1, car2)로 접근
Car car = new Car();  // 객체(인스턴스) 생성
car.gas = 10;
car.setSpeed(50);

Car car2 = new Car();
car2.gas = 20;
car2.setSpeed(60);

(2) this

  • 객체 내부에서 인스턴스 멤버에 접근하기 위해 'this.매개변수명'과 같은 형식으로 사용
Car(String color) {
  this.color = color;
}
void setColor(String color) {
  this.color = color;
}

2) 정적 멤버와 static

  • 정적 멤버: 클래스에 고정된 멤버로서, 객체를 생성하지 않고 사용 가능한 필드와 메서드
  • static: '고정된'이라는 의미

(1) 정적 멤버 선언

  • 필드와 메서드 선언 시 static 키워드를 붙임
  • 클래스에 고정된 멤버이므로,
    클래스 로더가 클래스(바이트 코드)를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리
    -> 클래스의 로딩이 끝나면 바로 사용 가능
  • main 메서드를 포함한 정적 메서드 선언 시, 내부에 인스턴스 필드나 인스턴스 메서드 + this 키워드 사용 불가
    -> 객체가 없어도 실행된다는 특징 때문
public class 클래스명 {
  // 정적 필드
  static 타입명 필드명 [= 초기값];
  
  // 정적 메서드
  static 리턴타입명 메서드명(매개변수선언) { ... }
}
  • 정적 메서드에서 인스턴스 멤버를 사용하고 싶다면, 아래와 같이 객체를 먼저 생성하고 참조 변수로 접근해야 함
static void method3() {
  ClassName obj = new ClassName();
  obj.field1 = 10;
  obj.method1();
}

(2) 정적 멤버 사용

  • 클래스가 메모리로 로딩되면 정적 멤버 바로 사용 가능
    -> 클래스 이름과 함께 도트(.) 연산자로 접근
// 정적 멤버 사용 예시
클래스.필드;
클래스.메서드(매개값, ...);

3) 싱글톤(Singleton)

  • 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우, 해당 객체를 부르는 명칭
  • 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막고, 정적 필드도 외부에서 필드값을 변경하지 못하게 함
    (private 접근 제한자 붙이기)
    -> 클래스 내부에서는 new 연산자로 생성자 호출 가능!
    • 대신 외부에서 호출 가능한 정적 메서드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체 리턴
  • 자신의 타입인 정적 필드를 하나 선언하고, 자신의 객체를 생성해 초기화
public class 클래스 {
  // 정적 필드
  private static 클래스 singleton = new 클래스();
  
  // 생성자
  private 클래스() {}
  
  // 정적 메서드
  static 클래스 getInstance() {
    return singleton;
  }
}
  • 외부에서 싱글톤의 객체를 얻는 유일한 방법
클래스 변수명1 = 클래스.getInstance();
클래스 변수명2 = 클래스.getInstance();

4) final 필드와 상수

(1) final 필드

  • 저장된 초기값이 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없는 필드
    -> 단, 초기값을 미리 주지 않는다면 생성자 매개값을 초기값으로 지정 가능 
  • 선언 형태
final 타입 필드 [= 초기값];

(2) 상수

  • static이면서 final이어야 하는 클래스에만 존재하는 불변의 값으로, 한 번 초기값이 저장되면 변경할 수 없음
  • 상수 이름은 모두 대문자로 작성하는 것이 관례로, 서로 다른 단어가 혼합된 이름이라면 _(언더바)로 단어들을 연결해 줌
static final 타입 상수 = 초기값;

2. 패키지와 접근 제한자

1) 패키지란

  • 패키지의 물리적인 형태는 파일 시스템의 폴더인데,
    폴더 기능을 함과 동시에 클래스의 일부분으로서 클래스를 유일하게 만들어주는 식별자 역할
  • 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식
    -> 클래스의 전체 이름은 '패키지 이름+클래스 이름'인데 패키지가 상/하위로 구분되어 있다면 도트(.)를 사용하여 표현
상위패키지.하위패키지.클래스

2) 패키지 선언

  • 클래스를 작성할 때 해당 클래스가 어떤 패키지에 속할 것인지 선언하는 것
package 상위패키지.하위패키지;

public class ClassName {
  ...
}

 

*import문

  • 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 있다면,
    import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알림
    -> 사용하고자 하는 클래스들이 동일한 패키지에 소속되어 있으면,
        *를 이용해서 해당 패키지에 소속된 클래스들을 사용할 것임을 알림
import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;

3) 접근 제한자(Access Modifier)

  • 클래스 및 인터페이스들이 가지고 있는 멤버의 접근을 제한
default 클래스, 필드, 생성자, 메서드에 적용 기본 설정으로, 같은 패키지에 소속된 클래스에서만 사용
public 클래스, 필드, 생성자, 메서드에 적용 외부 클래스가 자유롭게 사용
protected 필드, 생성자, 메서드에 적용 같은 패키지에 소속된 클래스와 자식 클래스에서만 사용
private 필드, 생성자, 메서드에 적용 외부에서 사용 불가

*Getter/Setter

  • 필드는 외부에서 접근할 수 없도록 막으면서, 메서드는 공개하여 외부에서 메서드를 통해 필드에 접근하도록 유도
  • 필드의 값을 외부로 리턴해주는 메서드 Getter, 외부에서 값을 받아 필드를 변경하는 메서드 Setter
반응형