자바(JAVA)/미니 프로젝트 & 기초 공부
Java 기초 또 다시 공부하기 10일차 - 객체 지향 프로그래밍(인스턴스 멤버와 정적 멤버, 패키지와 접근 제한자)
개발학생
2025. 6. 11. 17:12
반응형
이전 공부글
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
반응형