[Day 4 | Java] 캡슐화

y♡ding·2024년 10월 17일
0

데브코스 TIL

목록 보기
21/163

📌 Getter / Setter와 캡슐화

캡슐화(Encapsulation)데이터(멤버 필드)메서드를 하나의 단위(클래스)로 묶고, 외부에서의 직접 접근을 제한하는 객체 지향 프로그래밍(OOP)의 핵심 개념이다. 이를 통해 클래스의 내부 구현을 감추고, 외부에서는 제공된 메서드만으로 상호작용하게 하여 데이터 보호유효성 검증을 보장한다.

💊 캡슐화의 주요 목표

  1. 내부 구현 감추기: 객체의 상태(필드)를 외부에서 직접 수정하거나 조회할 수 없고, 필요한 메서드만을 통해 접근할 수 있다.
  2. 데이터 보호: 잘못된 데이터로 인해 객체가 무결성을 잃는 것을 방지한다.
  3. 유효성 검증: 데이터를 수정할 때, 유효성 검증을 통해 잘못된 값이 입력되는 것을 차단한다.

캡슐화는 주로 접근 제어자(private)Getter/Setter 메서드로 구현됩니다.


1. 캡슐화 구현 방법

1️⃣ 필드의 private 선언

  • 클래스의 멤버 필드는 기본적으로 private으로 선언하여, 외부에서 직접 접근을 차단한다. 이렇게 하면 외부 클래스가 객체의 상태를 직접 변경하지 못하게 할 수 있다.

2️⃣ Getter/Setter 메서드

  • public 접근 제어자로 제공되는 GetterSetter 메서드를 통해 간접적으로 필드에 접근한다. 이렇게 함으로써 데이터의 안정성을 확보하고, 값의 유효성 검증을 할 수 있다.

2. Getter와 Setter

1) Getter 메서드

  • Getter 메서드private 필드에 저장된 값을 조회하는 역할을 한다. 데이터 타입과 동일한 반환값을 가지며, 메서드 이름은 get + 필드명 형식으로 작성한다.

  • 예시코드:

    public class Person {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    }

2) Setter 메서드

  • Setter 메서드private 필드의 값을 변경할 때 사용된다. 매개변수로 새로운 값을 전달받아 필드에 할당하며, 유효성 검증을 통해 잘못된 값이 입력되지 않도록 할 수 있다. 메서드 이름은 set + 필드명 형식으로 작성한다.

  • 예시코드:

    public class Person {
        private String name;
        private int age;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
            if (age > 0) {  // 유효성 검사
                this.age = age;
            }
        }
    }

3. Getter/Setter를 활용한 예시코드

class Modifier {
    private String data;

    // 데이터 입력용 Setter 메서드
    public void setData(String data) {
        this.data = data;
    }

    // 데이터 출력용 Getter 메서드
    public String getData() {
        return data;
    }
}

public class Main {
    public static void main(String[] args) {
        Modifier m = new Modifier();
        m.setData("테스트 데이터");  // Setter를 통해 데이터 설정
        System.out.println(m.getData());  // Getter를 통해 데이터 조회
    }
}

4. Getter/Setter와 생성자의 결합

Getter/Setter는 단순히 데이터의 조회와 설정만 가능하게 할 뿐만 아니라, 생성자와 결합하여 객체가 생성될 때 필드를 초기화하고 유효성 검사를 할 수 있다. 특히 생성자 내부에서 Setter 메서드를 사용하면, 객체 생성 시에도 유효성 검증을 적용할 수 있다.

class Time {
    private int hour;
    private int minute;
    private int second;

    // 생성자: 유효성 검증을 포함한 필드 초기화
    public Time(int hour, int minute, int second) {
        this.setHour(hour);  // Setter를 통해 유효성 검증 후 초기화
        this.setMinute(minute);
        this.setSecond(second);
    }

    // Getter / Setter 메서드
    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        if (hour < 0 || hour >= 24) {
            hour = 0;  // 유효성 검사
        }
        this.hour = hour;
    }

    public int getMinute() {
        return minute;
    }

    public void setMinute(int minute) {
        if (minute < 0 || minute >= 60) {
            minute = 0;
        }
        this.minute = minute;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        if (second < 0 || second >= 60) {
            second = 0;
        }
        this.second = second;
    }
}

public class Main {
    public static void main(String[] args) {
        Time t = new Time(25, 61, 30);  // 유효하지 않은 값 입력
        System.out.println(t.getHour() + "시 " + t.getMinute() + "분 " + t.getSecond() + "초");
    }
}

출력:

0시 0분 30초
  • 잘못된 입력 값(25, 61)은 유효성 검사에 의해 0으로 처리됨.

👍🏻 캡슐화의 장점

  1. 내부 구현을 감추어 데이터 보호:
    • 외부에서 객체의 필드에 직접 접근하지 못하게 함으로써 데이터의 일관성을 유지할 수 있다.
  2. 유효성 검증:
    • Setter 메서드를 통해 데이터를 변경할 때 유효성 검증을 추가할 수 있어, 잘못된 값이 입력되는 것을 방지할 수 있다.
  3. 코드 유지보수성:
    • 데이터 접근 방식을 일관되게 유지할 수 있어, 코드의 유지보수가 용이해진다.
  4. 유연성:
    • 필드 값을 수정하거나 처리하는 방법을 변경하더라도 외부에 영향을 주지 않기 때문에 유연한 코드 변경이 가능하다.

캡슐화는 객체 지향 프로그래밍에서 데이터 보호유효성 검증을 구현하는 중요한 기법으로, 자바에서는 private 필드public Getter/Setter 메서드를 통해 이를 구현한다. Getter/Setter를 사용하면 외부에서 객체의 내부 데이터를 안전하게 관리하고, 데이터 무결성을 유지할 수 있다.

0개의 댓글

관련 채용 정보