[2021-06-23]Java

SPIDER·2021년 6월 27일
0

Java 공부

목록 보기
6/14
post-thumbnail

6일차



접근 제어자


보통 우리가 접근 제어자를 쓰기전 사용하는 코드는

public class Person{
	int age;
    }

여기서 age 변수에 접근하려면 그냥 클래스를 불러와서 값을 입력해주는
다음과 같은 방식이다

public class Driver {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.age = 28;
        p1.age = -10;
        System.out.println(p1.age);
    }
}

이 코드는 굉장히 불편한 코드다.
사실 나이에 음수가 입력되면 안되지만 위 코드는 음수도 입력이 되고
중요한것은 객체에 대한 권한이 public 이기때문에 어느 클래스에서든 접근이 가능하다.

Java에서는 이러한 상황을 막기위한 접근제어자 라는것이 있다.

위 코드의 age변수에 private 라는 제어자를 붙여주면 된다.

public class Person{
	private int age;
    }

접근제어자 private는 다른 클래스에서 접근할 수 없고 오직 해당 클래스에서만
값을 변경 또는 읽는 것이 가능해진다.

그러면 age값을 다른 클래스에서 변경하고싶다면 어떻게 할까?


해결방법으로 메소드를 이용하는 방법이 있다.

public class Person {
    private int age;

    public void setAge(int newAge) {
        if (newAge > 0) {
            age = newAge;
        }
    }

    public int getAge() {
        return age;
    }
}

위 코드에서 setAge 와 getAge 같은 메소드를 흔히 setter, getter 메소드로 부르는데

다른 클래스에서 접근하려고 할 때 setter, getter 를 통해 변수에 접근하여
값을 변경 또는 읽을 수 있다.


그냥 접근해서 값을 바꿔줄 수 있게 private를 사용하지 않으면 되지
왜 굳이 private 를 사용해서 접근을 제어하게 만들까?

접근제어자를 공부하던 중 위 질문에 대한 답이 너무 궁금했다.

어찌되었든 접근을 하여 값을 변경 또는 읽을 것이라면

왜 private를 사용해서 필요없는 메소드를 두개나 더 만들까?..

링크텍스트

위 링크에 나온 oyeon님의 블로그에서 많은 해답을 얻었습니다.

관건은 캡슐화

객체지향 프로그래밍의 캡슐화를 달성하기 위해 접근제어자를 사용한다고 볼 수 있는데

그러면 캡슐화의 장점은 무엇일까?

1. 다른 객체에게 자신의 정보를 숨기고 오직 연산만을 통해서
접근이 가능하도록 할 수 있다.

메소드를 통한 값 변경, 읽기 가 그 예이다.


2. 변수를 private로 설정하고 setter 메소드를 구현하지 않고
getter 메소드만 구현 함으로써 값을 변경할 수 없고 오직 읽기만 가능하도록 만들어 줄 수 있다는 것이 장점이다.



3. setter 메소드를 이용하여 외부에서 할당하는 값에 조건을 달아줄 수 있다.
위에 언급한 나이에 대한 양수 조건이 그 예이다.




메소드 오버로딩


메소드 오버로딩은 클래스 내 같은 이름의 메소드를 2개이상

정의할 수 있게 해주는 기능이다.
public class Calculator {
    int add(int a, int b) {
        return a + b;
    }

    int add(int a, int b, int c) {
        return a + b + c;
    }

    double add(double a, double b) {
        return a + b;
    }

    public static void main(String[] args) {
        Calculator c = new Calculator();

        System.out.println(c.add(2, 4));        // test 1
        System.out.println(c.add(2, 4, 8));     // test 2
        System.out.println(c.add(3.14, 2.54));  // test 3
    }
}


6
14
5.68

이처럼 add라는 이름의 메소드가 3개나 있는데 안에 있는 파라미터 들이 다르기 때문에
Java에서는 다른 메소드로 인식을 할 수 있다.

profile
🕷기적을 만드는 개발 기록🕷

0개의 댓글