참고

  • p.144~150
  • OOP2_Basic.java : 기본설명
  • ProTest_01.java , ProTest_02.java, ProTest_03.java(z_exam) : 접근제어자
  • TimeTest.java : 캡슐화

제어자

  • 변수, 메서드 그리고 클래스의 선언부에 사용이 된다.
  • 일반적으로 접근제어자를 가장 왼쪽에 써준다.
private static final int a;

접근제어자

  • p.146~148
  • 오직 1개만

public

  • 같은 프로젝트 내에서 접근제한이 없다
  • 클래스가 public이면 생성자도 public

protected ★

  • 같은 패키지 + 다른 패키지에 있는 클래스의 자손클래스에서 사용가능
  • 클래스에는 사용불가 ★
    • 상속이 먼저 이루어져야 쓸 수 있는데, protected class로 선언이 되면 상속자체가 될 수 없기 때문
  • 잘 쓰이지는 않음

default

  • 같은 패키지 내에서만 사용가능

private

  • 같은 클래스 내에서만 사용가능
  • 클래스에는 사용 불가 ★
    • 클래스는 다른 곳에서 쓰려고 만드는 것이기때문

그 외 제어자

  • p.144~146
  • 여러개 가능

static (클래스의, 공통적인)

  • 모든 인스턴스가 공통으로 사용하는 녀석
  • 변수, 메서드, 초기화블럭에 사용할 수 있다.
    • 변수나 메서드에 사용시
        1. 모든 인스턴스에서 공통적으로 사용
        1. 인스턴스의 생성없이 사용할 수 있다.
        1. 클래스가 Method Area에 로드될때 같이 생성된다.
        1. 클래스 멤버에서는 인스턴스 멤버를 호출할 수 없다.

final (마지막의, 변경될 수 없는)

  • 변수에 사용시, 값을 변경할 수 없는 상수가 된다.
  • 메서드에 사용시, 오버라이드할 수 없는 메서드가 된다. (= 수정해서 못 쓴다)
  • 클래스에 사용시, 상속할 수 없는 클래스가 된다. (=부모 클래스가 될 수 없다)
    • 생성자가 private인 경우

abstract (추상의, 미완성의)

추상메서드

  • 메서드는 선언부와 구현부로 되어있지만 추상메서드는 선언부만 존재
  • 물끓이는 기능은 있는데 끓이는 방법이 적혀있지 않음

추상클래스

  • 추상메서드를 한 개라도 가지고 있으면 해당 클래스는 추상클래스가 되어야한다
  • 클래스는 뭉텅이, 선언부+구현부 아님
abstract class A{ //추상메서드가 있기때문에 추상클래스
     abstract void method(); //선언만 되어있음
}

캡슐화

  • p.149~150
  • 접근제어자를 사용하는 이유
    • 외부로부터 데이터를 보호하기 위해서
    • 외부에는 불필요한 부분을 감출 수 있다.

DTO: Data Transfer Object

  • DB테이블의 변수만 가지고있음
class MemberDTO{
    String mem_id; //db 컬럼1개 - java 변수1개 매칭되는 것
    String mem_pw;
    String mem_name;
}

VO: Variable Object

  • 테이블2개조인하면서 필요한컬럼속속속빼서 유동적으로 만든 테이블은 VO
  • 우리가 주로 쓰는 것
class MemberCartVO{

}

생성자의 접근제어자

  • 인스턴스의 생성을 제한
  • 생성자의 접근제어자를 private으로 할 경우
    • 외부에서는 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없다.
    • 다른 클래스의 조상이 될 수없다. 그러므로 final을 붙여 주어야 한다.

싱글톤패턴

  • SingletonTest.java
  • 지금까지는 필요할때마다 객체를 만들었지만 이제는 객체 생성에 제한을 둘 것임.
    • 기존: default 싱글톤: private -> 객체생성 불가능
    • 그럼 객체를 얻어올 수 있는 메소드를 만들어서 써야함
  • 특정 클래스의 객체가 오직 한 개만 존재하도록 보장한다. 즉 클래스의 객체를 하나로 제한한다.
  • 고급자바부터 100% 적용됨
  • 가장 많이 쓰이는 패턴
  • 프로그램실행 -> 클래스 전부 로드 -> 객체 전부 생성해서 바로 사용 (실행 속도는 빠르나 처음 로드시 오래걸림)
public class SingletonTest{
    public static void main(String[] args){
    
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        //6. s1만듬-> 객체생성 (null -> 객체주소)
        //-> s가 널이 아니니 if문 실행되지 않음
        //-> 아무리만들어도 s1의 주소만 생성됨.
        //-> 객체생성을 제한하는 방법
    
    }
}

final class Singleton{//7.생성자의 접근제어자: private -> final class -> 조상 불가

    static private Singleton s;//5. default로 두면 꺼내가니까 private으로
    
    private Singleton(){ //1. 기본생성자를 private으로 지정
    
    }
    
    //2. 기본생성자가 private = 다른 클래스에서 쓸 수 없음
    //   객체를 생성하는 getInstance()를 생성
    static Singleton getInstance(){//4.다른 클래스에서 객체생성 없이 쓰기위해 static 메소드로 만듬. 변수도 class변수로
        if( s == null){ //3.처음에 Singleton s 선언될땐 null이었음
            s = new Singleton(); //Singleton 생성자 = private =>클래스 내에서 사용가능
        }
        return s;
    }
}

profile
갈 길이 멀다

관심 있을 만한 포스트

0개의 댓글