Java -6

김정현·2024년 4월 16일
0

JAVA

목록 보기
6/19

접근제어자

Auto Import

같은 패키지 일때는 패키지명 생략가능
다른 패키지 일때는

exam02.A a = new exam02.A();

or

import exam02.A;
A a = new A();

이런식으로 표기해야함

  • 해당 패키지 모든 클래스를 사용
import exam02.*;
setting -> Editor -> General -> Auto Import -> Add umambiguous, optimize imports on the fly

해당 설정을 켤 시 자동 import 및 불필요한 import를 없애줌.

1. public

: 모든 패키지 범위 내에서 접근이 가능

2. protected

:같은 패키지 내에서만 접근가능, 외부 패키지에서는 상속을 통하면 클래스 내부에서 접근 가능
default + 상속(private)

3. default

: 접근 제어자를 정의 X / 같은 패키지 내에서만 접근 가능(접근 제어자를 표기하지 않을시 기본)

4. private

: 클래스 내부에서만 접근 가능

public > protected > default > private

  • 하위 패키지더라도 다른 패키지로 취급

정보 은닉

get, set 메서드

get멤버 변수명() -> getter 함수
set멤버 변수명() -> setter 함수

멤버 변수에 직접 값을 대입하는 것 -> 통제 불가 ; 사용 지양
-멤버 변수의 값을 확인할 수 있는 접근 가능한 메서도 추가

set변수명
private int year;
    private int month;
    private int day;

    public void setYear(int _year){
        year = _year;
    }
    public void setMonth(int _month){
        month = _month;
    }
    public void setDay(int _day){
        if (month == 2 && _day > 28) {
            _day = 28;
        }
        day = _day;
    }

인스턴스에서 대입하는 변수를 컨트롤 할 수 있게끔 클래스 쪽에서 정보를 은닉하는 것이 좋다.

또, 인스턴스쪽에서 정보를 가져올 수 있게끔 클래스 쪽에서

public int getYear() {
        return year;
    }
    public int getMonth() {
        return month;
    }
    public int getDay() {
        return day;
    }

반환값을 설정해주는 것이 좋다.

단축키

Alt + Enter -> getter, setter 자동 설정 가능

  • 단축키로 설정할경우 This

원래 getter, setter 와 다르게 this가 생성된다.
이때에 This는 s1을 가르친다. (클래스기반으로 생성된 인스턴스)

    this.year = year;

this를 쓰는이유
-> year가 파라미터 지역변수 year를 나타내는지 s1.year 멤버 변수 year을 나타내는지 명확하지 않기 떄문에.

참고) Record 클래스
클래스 대신 Record 생성
바꾸는경우 없는경우

//Record 클래스
package exam01;

public record Schedule2(int year, int month, int day) {
}
//Ex04에서
package exam01;

public class Ex04 {
    public static void main(String[] args) {
        Schedule2 s1 = new Schedule2(2024, 4, 17);
        int year = s1.year();
        int month = s1.month();
        int day = s1.day();
        System.out.printf("%d-%d-%d\n", year, month, day);

        System.out.println(s1); //s1.toString();

    }
}

static 변수

  • 정적 메모리
    -데이터 영역 메모리
    -변하지 않는 데이터
    -코드 & 상수 영역
    -애플리케이션 시작시 생성, 종료시 제거
  • 동적 메모리
    -스택 영역 메모리
    -힙영역 메모리

static 변수 (클래스 변수)

처음 로드 될때부터 데이터 영역 메모리에서 이미 값이 할당 되어있다.
(객체 생성과 관련X)
두가지 인스턴스가 있다고해도 같은 주소를 참고한다.

  • 객체가 아니여서 클래스명으로 직접 접근가능

호출할때 인스턴스.static변수명, 클래스.static변수명 두가지 모두 가능하지만
헷갈리지 않기 위해 후자가 선호된다.

클래스.static변수명 

static 메서드

객체 생성과 상관없이 사용 가능
클래스명으로 직접 호출 가능
클래스 메서드

일반적인 메서드는 객체가 존재해야 객체 자원을 사용해 호출할 수 있지만,
static 메서드는 객체가 존재하지 않아도 사용할 수 있기때문에 this가 존재하지 않는다.

즉, 객체의 자원에 접근할 수 없다.

정적인 자원은 접근 가능.

데이터영역 메모리 내부에 메서드영역 존재. (상수와 같이 취급)

싱글톤 패턴

메모리를 절약하는 방법 패턴

java.lang.Math
-수학 관련 편의 기능 모음 클래스

java.util.Arrays
-배열을 다룰때 사용할 수 있는 편의 기능 모음 클래스

편의 기능 모음 클래스의 경우는 객체를 여러개 생성할 필요 X
-> 메서드나, 변수, 상수를 static으로 정의한 경우가 많다.

-> 문제점?
static : 처음부터 공간 할당, 활성화 -> 사용하지 않아도 이미 메모리를 차지
-싱글톤 패턴으로 해결

싱글톤 패턴

1) 기능을 담당하는 객체는 여러개 만들 필요가 없다.
2) 이 기능이 항상 필요하진 않는다. 필요할 때만 생성.
3) 객체는 필요할때 하나만 생성, 공유

만드는 방식

1) 생성자를 외부에서 직접 호출 X, 접근제어자 private로 변경

public class Board {
    private Board() {}
}

2) 클래스 내부에서 정적(static) 변수로 선언

public class Board {
    private Board instance = new Board();
    private Board() {}
}

3) 클래스 내부에서 생성된 객체를 반환하는 정적(static) 함수
-최초 호출 시 정적 변수에 객체를 생성

public class Board {
//    private static Board instance = new Board();           //클래스 로드 시점부터 객체

    private static Board instance;

    private  Board() {}

    public static Board getInstance() {
        if (instance == null) {
            instance = new Board();
        }
        return instance;
    }
}

4) 동시성 작업: 동기화 처리

변수의 유효범위

  1. 지역 변수
    -함수가 호출, 실행시에만 스택에서 공간을 할당
    -함수의 연산이 종료(return), 스택에서 제거
    -함수 지역 안에서만 유효한 변수

  2. 멤버 변수(인스턴스 변수)
    -객체 생성시 힙메모리에 생성되는 변수
    -객체의 참조가 끊어지면(더이상 사용하는 참조 변수가 없으면) , 가비지 콜렉터(GC) 제거

3.static 변수
-애플리케이션 로딩시 처음부터 데이터 영역에 할당되는 변수
-애플리케이션 종료시 제거됨

0개의 댓글