[혼공자][week3] Day11 인스턴스, 패키지, 접근 제한자 접근금지!!!

Ida·2025년 2월 3일
0

혼공자

목록 보기
12/20

복습복습복습, 이제 그만 놉시다

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

1. 인스턴스 멤버와 this

인스턴스 멤버
객체(인스턴스) 생성 후 사용 가능한 필드와 메소드, 각각 인스턴스 필드와 인스턴스 메소드로 불림
객체 없이 사용 X
객체마다 가지고 있어야하는 데이터 사용 시 인스턴스 필드로 선언

인스턴스 멤버 (손코딩)

클래스에서 필드, 생성자, 메소드 선언하고 this를 이용해서 인스턴스 멤버에 접근

2. 정적 멤버와 static

정적멤버
클래스에 고정된 멤버, 객체 생성 X
정적 필드, 정적 메소드라 부름
객체마다 가질 필요 없는 공용 데이터 사용 시 정적 필드 선언

정적 멤버 선언
정적 필드와 정적 메소드 선언 시 static 키워드 추가 해주면 됨.

정적 필드: static 타입 필드
정적 메소드: static 리턴타입 메소드 (매개변수선언, ...)

정적 멤버 사용
클래스가 메모리로 도딩되면 바로 사용 가능
클래스 이름과 도트 연산자로 접근

정적멤버사용 (손코딩)

Calculator 클래스

정적필드와 정적메소드임으로 객체 생성은 하지 않음.

정적 메소드 선언 주의사항 (손코딩)

  • 정적 메소드 내부에서 인스턴스 필드 혹은 인스턴스 메소드 사용 불가능
    -> 객체 생성 후 참조 변수로 접근 시 사용 가능
  • this키워드(객체 자신의 참조)도 사용 불가능

3. 싱글톤

싱글톤
단 하나의 객체만 만들도록 보장 해야할 때 하나만 생성되는 객체
클래스 외부에서 생성자 호출을 막기 위해 private 접근제한자를 붙여줌

  • 정적필드선언: 외부에서 필드값 변경 X, 자신의 타입인 정적 필드 선언과 자신의 객체 생성 후 초기화, new연산자로 생성자 호출할 수 없도록 함.
  • 생성자: 외부에서 호출 못하게 접근제한자 사용
  • 정적메소드: 외부에서 호출 가능한 정적 메소드인 getInstance() 선언 후 정적 필드에서 참조하고 있는 자신의 객체 리턴
    -> 외부에서 유일하게 객체를 얻는 방법임. getInstance() 메소드는 단 하나의 객체만 리턴함.
public class 클래스 {

	//정적 필드
    private static 클래스 singleton = new 클래스();
    
    //생성자
    private 클래스() {}
    
    //정적 메소드
    static 클래스 getInstance() {
    	return singleton;
    }
}

싱글톤 (손코딩)


4. final 필드와 상수

final 필드 (손코딩)

final 필드는 초기값이 최종값이 됨. 프로그램 실행 도중 수정 X

  • final 필드 초기값 저장법
    1. 필드 선언 시
    2. 생성자 초기값 지정: 복잡한 초기화 코드 혹은 객체 생성 시 외부 데이터로 초기화 해야할 때 선택 방법

초기화되지 않은 final 필드가 남아있으면 컴파일 에러 발생

  • 클래스
  • 정상적으로 실행됨
  • final 필드인 nation과 ssn를 수정하니 컴파일 에러 발생함. name은 일반적인 필드이기에 에러없이 새로운 값이 저장됨.

상수 (손코딩)

상수
불변의 값(원주율, 지구의 무게 및 둘레 등)을 저장하는 필드
객체마다 저장할 필요없는 공용성을 띠며, 수정이 불가능함 -> static final 필드가 상수를 의미함.

상수 이름은 관례적으로 모두 대문자로 작성함.

  • 상수 선언
  • 상수 사용

06-6 패키지와 접근 제한자

1. 패키지 선언

클래스가 속할 패키지를 정하는 것
클래스 이동 시 패키지 전체를 이동 해야 함.

패키지 이름

  • 숫자로 시작 X
  • _ 혹은 $를 제외한 특수문자 X
  • java로 시작 X
  • 모두 소문자로 작성 하는 것이 관례
  • 패키지 이름 중복 예방을 위해 관례적으로 도메인명.회사명.프로젝트명으로 작성함

import문

다른 패키지에 있는 클래스, 인터페이스 사용 시 import문으로 가져와 컴파일러에게 알려줌.

  • 작성위치: 패키지 선언과 클래스 선언 사이에 작성

import문, 이름이 같은 클래스가 존재할 때 (손코딩)

Tire 클래스가 두 패키지 모두 가지고 있어서 필드

import문 자동 추가 기능
이클립스에서 자동으로 사용된 클래스 조사해 필요한 import문을 추가하는 기능을 제공함

Cntrl + Shift + O

2. 접근 제한자

접근(클래스, 인터페이스, 각종 멤버들의 접근을 뜻함)을 제한하는 경우

  • 클래스, 인터페이스를 다른 패키지에서 사용 제한
  • 객체 생성을 막기 위한 생성자 호출 제한
  • 필드, 메소드 사용 제한

접근제한자 종류

  • public 접근 제한자: 외부 클래스의 사용을 허가
  • protected 접근 제한자: 같은 패키지 혹은 자식 클래스의 사용을 허가
  • private 접근 제한자: 외부에서 사용하는 것을 제한
  • default 접근 제한자: 위 세가지 접근 제한자에 해당하지 않는 경우. 같은 패키지에 소속된 클래스에서만 사용할 수 있음

public > protected > default > private

3. 클래스의 접근 제한

  • default
  • public

default 접근 제한

선언된 클래스를 다른 패키지에서 사용할 수 없음.
클래스 선언시 public을 생략하면 default 접근 제한을 가짐

public 접근 제한

패키지 위치에 제한없이 사용 가능함.
라이브러리 클래스 개발시 반드시 사용
클래스 선언 시 public을 붙이면 public 접근 제한을 가짐.

클래스 접근 제한 (손코딩)

패키지 package1에 클래스 A를 default 접근 제한

패키지 package1에 클래스 B를 public 접근 제한으로 선언
클래스 A는 default 접근 제한이고 같은 패키지이기 때문에 클래스 B에서 접근 가능.

클래스 C는 다른 패키지에 선언된 클래스 이므로 default 접근 제한인A클래스는 접근할 수 없다. (-> 컴파일 에러 발생)

4. 생성자의 접근 제한

public, default는 클래스 접근 제한과 동일한 접근 제한을 가짐

  • protected 접근 제한: 같은 패키지 내에서 생성자 호출 가능, 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자 호출 가능
  • private 접근 제한: 패키지 상관없이 생성자 호출 제한, 클래스 내부에서만 생성자 호출과 객체 생성이 가능함. 단 하나의 객체만 생성하는 싱글톤 패턴에서 해당 접근 제한을 사용하고 자신의 유일한 객체를 리턴하는 getInstance() 정적 메소드를 선언함.

생성자의 접근 제한 (손코딩)

같은 A 클래스 내부에서 A의 모든 생성자 호출 가능

B 클래스는 A 클래스와 동일한 패키지지만, private 접근 제한 생성자는 호출할 수 없음.

다른 패키지에 C 클래스 선언 시 public 접근 제한을 제외한 나머지는 호출할 수 없음.

5. 필드와 메소드의 접근 제한

생성자 접근 제한과 마찬가지로 public, default, protected, private 네 가지 접근 제한을 가짐

손코딩

A 클래스 내부에서 접근 제한 상관없이 필드와 메소드 사용 O

A 클래스와 동일한 패키지에선 private 접근 제한을 제외하곤 호출 가능

패키지가 다른 C 클래스에서는 A 클래스의 private와 default 접근 제한은 호출할 수 없음

6. Getter와 Setter 메소드

객체 필드를 외부에서 직접적으로 수정할 경우 객체 무결성이 깨질 수 있음.
객체 지향 프로그래밍에서 메소드를 통해 필드 변경을 할 수 있도록 하는 메소드가 Getter과 Setter

클래스 선언 시 필드는 private로 선언해서 외부로부터 보호
private 타입 fieldName;

Getter

  • 외부에서 객체의 데이터 읽을 때 사용

  • 메소드로 필드값 가공 후 외부로 전달

  • 메소드 선언 방법
    public 리턴타입 getFieldName() { return fieldName; }
    - 접근 제한자: public
    - 리턴 타입: 필드 타입
    - 메소드 이름: get + 필드 이름(첫 글자 대문자)
    - 리턴값: 필드값

  • 필드 타입이 boolean일 경우 메소드 이름에 get대신 is 사용

    Setter

  • 매개값 검증 후 유효한 값만 객체의 필드로 저장

  • 메소드 선언 방법
    public void setFieldName(타입 fieldName) { this.fieldName = fieldName; }
    - 접근 제한자: public
    - 리턴 타입: void
    - 메소드 이름: set + 필드 이름(첫 글자 대문자)
    - 매개변수: 필드 타입

이클립스에 Getter과 Setter 메소드 자동 생성 기능 있음.

Getter, Setter 메소드 선언 (손코딩)


profile
나는 이다이다.

0개의 댓글

관련 채용 정보