이거 아님

요근래 개념 정리의 중요성을 정말 절실히 느끼고 있다...!
그런 김에 velog에 개념 정리를 하러 들어왔다.
이번 글에서 다룰 개념은 '캡슐화'이다!💊💊💊


캡슐화 (Encapsulation)

캡슐화는 관련이 있는 변수와 함수를 하나의 클래스로 묶고, 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.

외부에서 내부의 정보에 직접 접근하거나 변경할 수 없고, 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능하다.

캡슐화의 장점

  1. 유지보수나 확장 시 오류의 범위를 최소화한다.
  2. 객체 내 정보 손상과 오용을 방지한다.
  3. 데이터가 변경되어도 다른 객체에 영향을 미치지 않는다. (독립성이 좋다.)
  4. 최종으로 정리된 결과를 사용할 수 있다. (이식성이 좋다.)
  5. 객체를 모듈화할 수 있다.

접근제어자

캡슐화를 하기 위해서는 접근제어자를 통한 설계가 잘 이루어져야 한다. 이럴때 사용하는 제어자들의 종류를 알아보자.

클래스 접근 제어자

DefaultPublic
동일 패키지의 클래스에만 인스턴스(객체)를 생성 가능하다.다른 패키지에서도 인스턴스(객체)를 생성 가능하다.

메소드 접근 제어자

이 부분은 글로 구구절절 설명하기 보단 표 하나가 더 도움이 될 것 같아서 직접 그려서 올린다!

즉, 접근 허용 가능 범위 순서는 이렇게 정리할 수 있다.

public > default > protected> private

다음은 각 메소드 접근 제어자의 사용 예시이다.

pubilc 접근 제어자

public class Everywhere {

    public String var = "누구든지 허용"; // public 필드

    public String getVar() {             // public 메소드

        return this.var;

    }

protected 접근 제어자

package test;

 

public class SameClass {

    protected String sameVar = "다른 패키지에 속하는 자식 클래스까지 허용"; // protected 필드

}

다른 패키지에 속하는 자식 클래스도 접근이 허용된다.

package test.other;

import test.SameClass; // test 패키지의 SameClass 클래스를 불러들여 포함시킴.

 

public class ChildClass extends SameClass {

    public static void main(String[] args) {

        SameClass = new SameClass();

        System.out.println(sp.sameVar); // 다른 패키지에 속하는 자식 클래스까지 허용

    }

}

default 접근 제어자

package test;

 

public class SamePackage {

    String sameVar = "같은 패키지는 허용"; // default 필드

}

같은 패키지에 속한 클래스에서만 접근이 허용된다.

package test;

 

public class SameClass {

    String var = "다른 패키지는 접근 불가"; // default 필드

    public static void main(String[] args) {

        SamePackage sp = new SamePackage();

        System.out.println(sp.sameVar);     // 같은 패키지는 허용

    }

}

private 접근 제어자

public class SameClass {

    private String var = "같은 클래스만 허용"; // private 필드

    private String getVar() {                  // private 메소드

        return this.var;

    }

}

Getter와 Setter

Private를 사용하여 멤버 변수로의 접근을 제어한다는 내용을 위에서 다뤄보았다.

하지만 GetterSetter를 사용한다면 Private로 선언된 인스턴스 필드에 접근할 수 있다.

Getter와 Setter를 언제 사용하는지?

  • 멤버 변수의 정보 보기와 변경의 접근제어자를 다르게 하고 싶을 때
  • 멤버 변수를 바꿀 때 조건을 추가하고 싶을 때
  • 사용자가 원하는 데이터가 직접 저장되어 있는 게 아닌 계산을 해야만 하는 상황일 때

그럼 이것들이 각각 어떤 특징을 가졌는지 정리해보도록 하자!

Getter

게터(Getter):
초기화된 멤버 변수를 return할 때 사용한다.

  • 반드시 소문자 get을 접두사로 사용한다.
  • get 다음에 이어지는 단어의 첫번째 글자는 반드시 대문자로 작성한다.
  • 반드시 리턴값이 있어야 한다 (void 불가)
  • 매개변수가 없어야 한다.

Setter

세터(Setter):
멤버 변수를 매개 변수로 초기화한다.

  • 반드시 소문자 set을 접두사로 사용
  • set 다음에 이어지는 단어의 첫번째 글자는 반드시 대문자로 작성한다.
  • 반드시 리턴값이 없어야 한다 (무조건 void 사용)
  • 반드시 매개변수가 있어야한다.
public class Vehicle {
  private String color;
  
  // Getter
  public String getColor() {
    return color;
  }
  
  // Setter
  public void setColor(String c) {
    this.color = c;
  }
}

Vehicle 클래스에 선언된 String 타입 변수인 Color는 private 속성이기 때문에 접근할 수 없다.
다만 Getter를 사용하여 color값을 반환하고 Setter를 사용하여 color를 매개변수로 초기화하면, main 메소드에서 color값을 쉽게 변경할 수 있는 것이다!

public static void main(String[] args) {
  Vehicle v1 = new Vehicle();
  v1.setColor("Red");
  System.out.println(v1.getColor());
}

// Outputs "Red"

Getter와 Setter는 이후 제네릭 클래스를 구현할 때 이용하기도 하니 참고하자!


이렇게 한번 쭉 정리해보니 머릿속이 정돈되는 느낌이다. 앞으로 더 부지런해지자!! 파이팅! 👍

profile
N잡러를 꿈꾸는 코딩 학도의 우당탕탕 코딩 입문기🍳

0개의 댓글