4/17 정보은닉, 메모리

박세현·2024년 4월 17일

JAVA

목록 보기
7/22
post-thumbnail

정보 은닉(캡슐화)

  • 데이터를 외부에서 직접 접근하지 못하도록 제어하는 것
    -> 정보은닉은 객체의 내부 구현을 외부로부터 숨기고, 접근을 제한하여 객체의 데이터를 보호하고 유지보수성을 높이는 데 사용됨

  • 멤버 변수에 직접 값을 대입하는 것
    -> 통제 불가 : 사용을 지양
    -> 접근제어자를 통해 통제

  • 멤버 변수의 접근 제어자
    -> private, protected...

  • 근데 변수를 쓸려고 선언한건데 막아버리면 쓰질 못하니 통제가능한 수단(함수)을 활용해서 변수를 사용하자

  • 멤버 변수의 값을 확인(조회)할 수 있는 접근 가능한 메서드 추가
    -> get

  • 변수의 값을 지정할 수 있는 접근 가능한 메서드 추가
    -> set




1. ✨접근제어자 정리

변수에 값 직접 대입하지 못하게 통제하는 역할

1) public

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

2) protected

  • 동일 패키지에서 접근 가능(default)
  • 외부 패키지에 있는 클래스에서 상속을 받으면 클래스 내부에서 접근 가능(private)
  • default + private

3) default(기본값)

  • 접근 제어자를 명시 X : 동일 패키지에서 접근 가능

4) private

  • 클래스 내부 메서드 내에서만 가능

public > protected > default > private
적용범위: 클래스명, 변수, 메서드


예시)

ㄴ 2월에는 31일이 없는데 기입되네..이러면 안되는데
ㄴ 통제가 안된다
ㄴ 변수에 직접대입 지양하자

ㄴ private으로 통제시킴




1) public

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

예시)

다른 패키지면 패키지명 포함해서 써줘야 ㄹㅇ클래스명임
벗 같은 패키지면 생략 가능

근데 이거 너무 길어
import를 쓰자ㅏㅏ



① import

  • 다른 패키지에 있는 클래스를 사용하려면 import
  • import 패키지명.클래스명;

예시)

ㄴ import쓰면 앞에 패키지명 안써도 ㅇㅋ


예시) import 자동설정
import도 귀찮아
자동으로 import해주는 기능 설정하자


ㄴ add : 쓰고 있는 import알아서 추가(단, 애매하지 않고 확실할때만 추가)
ㄴ optimize : 안쓰는 import알아서 삭제


예시) * : 해당 패키지에 있는 모든 클래스 import하겠다



2) protected

  • 동일 패키지에서 접근 가능(default)
  • 외부 패키지에 있는 클래스에서 상속을 받으면 클래스 내부에서 접근 가능(private)
  • default + private


동일 패키지

외부 패키지

ㄴ 외부패키지 클래스 외부에선 접근x



3) default(기본값)

  • 접근 제어자를 명시 X : 동일 패키지에서 접근 가능
  • 접근 제어자를 명시하지 않으면 defaul로 설정한다


ㄴ 같은 패키지만 가능



4) private

  • 클래스 내부에서만 접근 가능
  • 클래스 내부 메서드{} 내에서만 가능

예시)

ㄴ 클래스 내부의 범위


예시) 호출하려면 private이 있는 메서드 내부에서 함수정의하고 외부에서 함수를 호출해서 출력하는 방법


참고) 하위패키지는 다른패키지이다




2. get(), set() 메서드

1) get()

멤버 변수의 값을 확인(조회)할 수 있는 접근 가능한 메서드 추가
ex) get멤버변수명()



2) set()

변수의 값을 지정할 수 있는 접근 가능한 메서드 추가
ex) set멤버변수명(...)



예시)

① private으로 변수 통제

② set함수를 통해 값 지정

ㄴ set변수명으로 함수이름 설정하는 것이 관례

ㄴ if문 써서 변수 값 통제함

③ get함수를 통해 값 조회

ㄴ get변수명으로 함수이름 설정하는 것이 관례


ㄴ month값만 나오게끔 출력 완

참고) get, set 자동완성
마우스 우클릭




3. this 예약어

  • 현재 클래스에 생성되어있는 객체의 주소값
  • 현재클래스 내부에 정의된 생성자


1) 변수

  • 인스턴스 매서드의 지역변수
  • 메서드 내부에서 객체의 자원을 접근하기 위한 주소값
  • 객체가 되면 사용할 수 있는 함수에는 보이지 않아도 항상 this가 있다
    -> like 생성자 함수, 상속의 super...
  • this값은 바뀌지 않는다
    -> 왜?
    -> 호출한 시점이 이미 객체를 만들고 난 뒤이기 때문에

예시)

package exam01;

public class Schedule {
    private int year;
    private int month;
    private int day;

    public Schedule() {
        this(2024, 4, 17);
    }

    public Schedule(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        if (this.month == 2 && day > 28) {
            day = 28;
        }

        this.day = day;
    }

    public void showDate() {
        System.out.printf("year=%d, month=%d, day=%d%n", year, month, day);
        printThis(); // this.printThis()
    }

    public void printThis() {
        System.out.println(this);
    }

    public Schedule returnThis() {
        return this;
    }

    @Override
    public String toString() {
        return "Schedule{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }
}


ㄴ this는 schedule이라는 객체의 주소값이다

ㄴ this의 주소값과 s1의 주소값이 같다

① this 생략


ㄴ this가 안보이지만 생략되어 있는 상태이다(지금은 설명을 위해 표시함)
ㄴ 멤버변수가 어디의 멤버변수인지 명확하다면 this 생략해도 된다

② this 생략 불가


ㄴ 벗 this가 애매할때는 생략 불가
ㄴ 위 예시에서 year가 지역변수의 year인지 멤버변수의 year인지 모호하기 때문에 this를 생략불가
ㄴ this.year = 멤버변수(인스턴스 변수, 힙에 있는 변수), 객체의 자원



2) 함수

  • 클래스 내부에서 정의된 생성자를 호출
  • 객체생성x, 생성자에 정의한 코드를 실행
  • 생성자 메서드 내부에서 주로 사용
    • 생성자 메서드를 다른 생성자에서 호출
    • 생성자 메서드의 첫 줄에만 사용가능

예시)

ㄴ 오류뜨는거는 기본생성자 함수 추가해서 그거 참조하게끔 해가지고 오류해결


ㄴ this가 첫줄이 아니면 오류 뜸

참고)
객체의 주소값 16진수로 표현하면 좀 더 짧게 표현 가능





메모리

1. 정적 메모리

  • 변하지 않는 데이터
  • 애플리케이션 시작시 생성, 애플리케이션 종료시 제거
  • ex) 데이터 영역 메모리, 코드&상수 영역, static변수


2. 동적 메모리

  • 생성과정 중에 생성과 소멸을 반복
  • ex) 스택영역 메모리, 힙영역 메모리



static 변수

1. static : 정적인, 고정된

  • <-> 반대: 동적인
  • 처음 로드 될때 부터 공간 할당
  • 객체가 생성되는 것과 관련x, 처음부터 공간을 할당
    = 객체 생성과 관련x, 처음부터 사용가능하다
    -> 동적자원 접근불가 (아직 동적자원에 객체가 생성이 안되어 있기때문에 접근할 자원이 없음)
  • 클래스명으로 직접 접근 가능
  • 클래스 변수
    -> 굳이 힙에 공간을 만들 필요가 없음
    -> 힙에서 공간을 만드는게 변수가 되기위한 과정인데 이미 변수이니까 그 과정이 필요가 없음
    -> this라는 지역변수x (인스턴스메서드만 this있음)

예시)
id는 이미 클래스로더에 올라갔을 때 부터 공간을 할당받아 변수이기 때문에 힙에 공간을 만들지 않음
name, subject는 아직 변수가 못됬기 때문에 생성자 함수가 힙에서 공간을 만들어줌

Student s1, Student s2가 id에 접근할 때는 동일한 자원에 접근한다

그래서 id값이 1001로 동일하게 나옴



1) static 메서드

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


2) instance메서드

  • 반드시 객체가 있어야지만 호출 가능


this의 목적은 객체의 자원 접근


반대로 instance메서드는 정적자원 접근 가능
객체가 생성된 이후 의 메서드 이기 때문에 이미 정적자원이 있을 시점이니까 접근가능
하지만 static메서드는 동적자원 접근 불가
왜냐면 아직 동적자원에 객체가 생성이 안되어 있기때문에 접근할 자원이 없음


ㄴ 함수는 기능이 똑같으니 모든객체가 공유할 수 있게 데이터 영역에 넣자
ㄴ 굳이 똑같은기능하는데 계속 만들어지지 않게끔 데이터 영역에 넣자
ㄴ 값만 바궈주면 되니 값은 힙 영역





변수의 유효범위

1. 지역변수

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



2. 멤버변수(인스턴스 변수)

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



3. static 변수

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




싱글톤 패턴

  • 어떤 클래스가 최대 한 번의 인스턴스(객체)만 생성되도록 보장하고, 그 인스턴스(객체)에 대한 전역적인 접근을 제공하는 패턴

  • static 응용 - 싱글톤 패턴
  • 메모리를 절약하는 방법 패턴
    ex) static : 처음부터 공간 할당, 활성화
    -> 사용하지 않아도 이미 메모리를 차지하는 문제가 있다
    -> 싱글톤 패턴으로 해결

참고) 편의기능
java.lang.Math : 수학 관련 편의 기능 모음 클래스
java.util.Arrays: 배열을 다룰 때 사용할 수 있는 편의 기능 모음 클래스

편의기능 클래스의 경우는 객체를 여러개 생성할 필요x
-> 매서드나 변수 상수를 static으로 정의한 경우가 많다
-> 문제점?
static : 처음부터 공간 할당, 활성화 -> 사용하지 않아도 이미 메모리를 차지하는 문제가 있다
-> 싱글톤 패턴으로 해결




1. 싱글톤패턴의 목적

1) 기능을 담당하는 객체는 여러개 만들 필요x

2) 이 기능이 항상 필요하지않으니 필요할 때만 객체 생성

3) 객체는 필요할 때 하나만 생성하고 공유




2. 싱글톤패턴 만드는 방식

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

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

3) 클래스 내부에서 생성된 객체를 반환하는 정적 함수(static)

  • 최초 호출 시 정적변수에 객체를 생성

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

  • 하나의 객체를 동시에 작업하다보면 문제가 생길 수 있음
static {
// 클래스가 로드 되는 시점부터 실행
// 객체가 생성하지 않아도 실행
}

profile
귤귤

0개의 댓글