JAVA

Java 오버로딩, 접근제어자, 캡슐화, 싱글턴

서묘_ 2021. 11. 30. 21:54

오버로딩

메서드명은 같지만 매개변수를 다르게 해서 새로운 메서드를 선언하는 것.

주로 비슷한 기능을 가지고 있는 메서드를 여러개 만들 때 적용한다.

 

주의사항

1. 메서드 이름이 다르면 오버로딩이 아니다.

2. 똑같은 메서드가 선언되면 오류난다. 매개변수의 순서, 타입, 개수 중 하나라도 달라야한다.

3. 리턴타입은 오버로딩과 상관이 없다.

 

 

접근제어자

클래스에는 메서드와 변수 생성자를 선언할 수 있다.

클래스, 메서드, 변수, 생성자 모두 호출해서 사용한다.

붙어있는 접근제어자에 따라서 호출이 제한될 수 있다.

 

종류

 

private 

프라이베이트로 읽을 것 같지만 프라이빗이라고한다.

같은 클래스의 멤버만 접근(사용) 가능하다. 다른 클래스에선 보이지 않는다. ( 은닉화 라고도 한다 )

 

(default)

같은 패키지의 멤버만 접근 가능하다. 

접근제어자를 생략했을 때 보이진 않지만 자동으로 작성되있는거다.

 

protected

같은 패키지자손 클래스에서 접근 가능하다.

 

public

같은 project라면 접근 제한이 없다. 

 

* 클래스 에는 (default), public 두가지만 사용 가능하다.

* 메서드, 변수, 생성자는 4가지 모두 사용 가능하다.

* 단, 지역변수는 메서드 안에서만 사용 가능하기에 접근제어자를 쓰지 않는다.

 

 

 

 

그럼 클래스 구조를 다시 보자

접근제어자 class 클래스명 {

        접근제어자 타입 변수명;   //변수 선언

        접근제어자 리턴타입 메서드명 ( 매개변수 ) { 수행문; }    //메서드 선언

        접근제어자 클래스명 (매개변수 ) { [인스턴스변수 초기화;] }    //생성자 선언

}

 

각 클래스들은 목적에 맞게 작성된다.

데이터 저장이 목적인 클래스는 주로 외부에서 사용하지 못하게 변수를 감춰두고(은닉화) 보호한다.

대신 메서드로만 값을 받아 저장하고 출력한다.

이를 캡슐화패턴이라고 한다.

 

변수에 public을 제외한 나머지 3가지로 감추는데 주로 private을 사용한다.

 

     private int number;

 

이런식으로 변수는 감춰두고 메서드를 이용해 값을 받고 출력하는데

 

값을 받을 때 setter메서드, 값을 출력할 때 getter메서드를 사용한다.

이 둘은 감춰둘게 아니기에 public 접근제어자를 사용한다.

 

     public void setNumber(int number) {

            this.number = number;

     }

 

     public int getNumber() {

            return number;

     }

 

* 이클립스는 변수를 선언해두고

소스창 우클릭 > source > Generate Getters and Setters to create 를 사용하면 자동으로 만들어 준다.

 

* 변수와 setter를 모두 제어처리하고 getter만 public으로 사용 할 수 있게 해두는 경우도 있다.

객체를 미리 하나만 만들어 놓고 외부에서는 생성을 못하게 막아버리는 싱글턴 패턴이라고한다.

변경해서는 안되는 값을 지정해야할 때 사용한다.

 

사용시

변수를 직접 사용 할 수 없기에 해당 클래스의 기본생성자를 new로 객체 생성해둔 후

클래스명(or매개변수).메서드명 으로 getter, setter를 호출해 사용한다.