My Melody Is Cute JAVA 기초9 객체지향프로그래밍 심화
본문 바로가기

개발공부🌷/JAVA

JAVA 기초9 객체지향프로그래밍 심화

 

캡슐화

특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것

왜 해야할까? 데이터 보호,내부적으로만 사용되는 데이터를 불필요한 외부노출 방지 독립성확보, 유지보수에 용이

 

패키지(package)

특정한 목적을 공유하는 클래스와 인터페이스묶음 (클래스 - 관련있는 속성과 기능을 묶어서 관리)

패키지가 있는 경우 소스 코드의 첫 번째 줄에 반드시 package 패키지 명이 표시

패키지는 클래스들을 그룹단위로 묶어 효과적으로 관리한다

클래스의 충돌을 방지 ex)같은 이름의 클래스가 각각 다른 패키지에 있으면 충돌 x

 

Import문

import문은 다른 패키지 내의 클래스를 사용하기 위해 사용

일반적으로 패키지 구문과 클래스문 사이에 작성

import문이 없다면??? 다른패키지의 클래스를 사용할때 매번 패키지명을 붙여줘야 한다....번거로움

import 패키지 명.* 으로 작성하면 해당 패키지의 모든 클래스를 패키지 명 없이 사용할 수 있다

import 패키지 명.클래스 명; 또는 import 패키지 명.*;
package practicepack.test;

public class ExampleImp {
    public int a = 10;
    public void print() {
        System.out.println("Import 문 테스트");
    }
}
package practicepack.test2; // import 문을 사용하는 경우

import practicepack.test.ExampleImp // import 문 작성

public class PackageImp {
		public static void main(String[] args) {
			ExampleImp x = new ExampleImp(); // 이제 패키지 명을 생략 가능
		}
}

 

접근제어자

 

제어자(Modifier)

클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드

맛있는 빨간 사과 : 형용사의 역할

접근 제어자 public, protected, (default), private
기타 제어자 static, final, abstract, native, transient, synchronized 등

하나의 대상에 대해서 여러 제어자를 사용할 수 있다

각 대상에 대해서 접근 제어자는 단 한번만 사용

 

접근 제어자(Access Modifier)

클래스 외부로의 불필요한 데이터 노출을 방지(data hiding)

외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다

접근 제어자 접근 제한 범위
private 동일 클래스에서만 접근 가능
default 동일 패키지 내에서만 접근 가능 / 기본 설정 아무제어자 없을때 자동설정됨
protected 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능
public 접근 제한 없음

 

public(접근제한x) > protected(동일 패키지+하위클래스) > default(동일 패키지) > private(동일 클래스)

 

 

package package1; // 패키지명 package1 

//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
    public static void main(String[] args) {
        Parent p = new Parent();

//        System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
        System.out.println(p.b);
        System.out.println(p.c);
        System.out.println(p.d);
    }
}

public class Parent { // Parent 클래스의 접근 제어자는 public
     // a,b,c,d에 각각 private, default, protected, public 접근 제어자 지정
    private int a = 1; //같은 클래스내에만 접근가능
    int b = 2;
    protected int c = 3;
    public int d = 4;

    public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}

// 출력값
2
3
4

동일한 패키지 동일한 클래스내에서는  private도 접근가능 

위의 다른 클래스인 Test 클래스에서 private는 접근 x

 

다른 패키지에 있는 경우

package package2; // package2 

//파일명 Test2.java
import package1.Parent;

class Child extends package1.Parent {  // package1으로부터 Parent 클래스를 상속
    public void printEach() {
        // System.out.println(a); // 에러 발생!
        // System.out.println(b);
        System.out.println(c); // 다른 패키지의 하위 클래스
        System.out.println(d);
    }
}

public class Test2 {
    public static void main(String[] args) {
        Parent p = new Parent();

//        System.out.println(p.a); // public을 제외한 모든 호출 에러!
//        System.out.println(p.b);
//        System.out.println(p.c);
        System.out.println(p.d);
    }
}

child 클래스는 같은 클래스,같은 패키지 안에 있는 private(a) , default(b) 접근 제어자를 사용하는 멤버에게는 접근 x

다른 패키지 하위 클래스에 접근가능한 protected(c), 어디서나 접근 가능한 public(d)에는 접근 o

 

Test2 클래스는 상속받지 않아서 protected(c)는 접근x public(d)만 접근 o

 

 

getter와 setter 메서드

 

private 접근 제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나

수정하고 싶을 때 어떻게 할까??

 

public class GetterSetterTest {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setName("김코딩");
        w.setAge(30);
        w.setId(5);

        String name = w.getName();
        System.out.println("근로자의 이름은 " + name);
        int age = w.getAge();
        System.out.println("근로자의 나이는 " + age);
        int id = w.getId();
        System.out.println("근로자의 ID는 " + id);
    }
}

class Worker {
    private String name; // 변수의 은닉화. 외부로부터 접근 불가
    private int age;
    private int id;

    public String getName() { // 멤버변수의 값 
        return name;
    }

    public void setName(String name) { // 멤버변수의 값 변경
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 1) return;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

// 출력값
근로자의 이름은 김코딩
근로자의 나이는 30
근로자의 ID는 5

Woker클래스를 기반으로 객체 인스턴스를 생성해주고 같은 타입을 가지고 있는 참조변수 w에 담고

w의 setter 메서드를 사용해서 이름,나이,아이디에 대한 데이터값을 저장하고 

getter메서드를 통해 해당 데이터 값을 불러와 변수에 담아 출력해 주고 있음

 

setter메서드 외부에서 메서드에 접근하여 조건에 맞을경우 데이터값을 변경할 수 있게 해준다

메서드명에 set- 붙여서 정의 ex) setName()

 

getter메서드 이렇게 설정한 변수 값을 읽어오는데 사용한다

메서드명 앞에 get- 을 붙여서 사용

 

데이터를 효과적으로 보호하면서 의도하는 값으로 변경하여 캡슐화를 효과적으로 달성

 

 

일부 상황에서는 필드 값을 읽기만 하거나 값을 변경할 필요가 없는 경우에는

해당 필드에 대한 getter 또는 setter를 제공하지 않을 수 있다.

또한 필드의 접근 권한을 private로 설정하여 외부에서 직접 접근하지 못하도록 하는 경우,

해당 필드에 대한 setter를 제공하지 않을 수 있음

 

 

 

캡슐화 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

캡슐화 - 해시넷 (hash.kr)