(JAVA) 패키지, 접근제어자,Getter,Setter

InAnarchy·2022년 10월 20일
0

JAVA

목록 보기
13/18
post-thumbnail

Table of Contents

  • 패키지
  • 접근 제어자
  • 생성자의 접근 제한
  • 필드와 메소드의 접근 제한
  • ## protected 접근 제한자
  • Getter,Setter

패키지

  • 서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스(.class) 파일들을 한 곳에 묶어 놓은 것

패키지를 import하는 법

import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;

IntelliJ에서 MAC 기준으로 자동 import 단축키는 option+Enter

이 때, 다음의 두 코드는 서로 의미가 다르다.

import java.util.*; //java.util 패키지의 모든 클래스
import java.text.*;
import java.*; //java패키지의 모든 클래스

이 때 아래의 코드는 java패키지의 모든 클래스를 의미하는데 패키지는 포함되지 않는다.

Static멤버를 사용할 때는 클래스 이름을 생략할 수 있다.

import static java.lang.Integer.*; //Integer클래스의 모든 static 메서드
import static java.lang.Math.random;
import static java.lang.System.out;//System.out을 out만으로 참조가능

이 때

System.out.println(Math.random());

out.println(random())

으로 생략하여 사용할 수 있다.

import static java.lang.Integer.*;
import static java.lang.Math.*;
import static java.lang.System.out;

public class Ex {
    public static void main(String[] args) {
        out.println(random());
        out.println("Math.PI:" + PI);
    }
}

접근 제어자

  • public: 외부 클래스가 자유롭게 사용 가능
  • protected: 같은 패키지 또는 자식 클래스에서 사용 가능
  • private: 외부에서 사용 불가
  • default: 같은 패키지에 소속된 클래스에서만 사용 가능

package packTest;

class A {
}
package packTest;

public class B {
    A a;
}

A,B클래스는 같은 패키지이므로, A클래스에 접근 가능하다.

package packTest2;
import packTest.*;

public class C { 
    A a; //디폴트 접근제한이라 컴파일 에러 
    B b; //public은 가능
}

C클래스는 A,B와 다른 패키지이다.
이 때 default 접근제한을 갖는 A클래스에는 접근이 되지 않지만, public 접근 제한을 갖는 B클래스에는 접근이 가능하다.

생성자의 접근 제한

생성자도 클래스의 접근 제한과 동일하다.

package packTest;

public class A{
    A a1 = new A(true);
    A a2 = new A(1);
    A a3 = new A("문자열");

    public A(boolean b){} //public
    A(int b){}
    private A(String s){}
}
package packTest;

public class B {
    A a1 = new A(true);
    A a2 = new A(1);
//    A a3 = new A("문자열");
}

클래스 A,B는 패키지가 동일하므로 A클래스의 private 생성자를 제외하고는 모두 호출할 수 있다.

package packTest2;
import packTest.*;

public class C {
    A a1 = new A(true);
//    A a2 = new A(1);
//    A a3 = new A("문자열");
}

패키지가 다른 C클래스에서는 public생성자를 제외하고 다른 생성자를 호출할 수 없다.

필드와 메소드의 접근 제한

package packTest;

public class A {
    public int field1;
    int field2;
    private int field3;
    
    //클래스 내부일 경우 접근 제어자의 영향X
    public A() {
        field1 = 1;
        field2 = 1;
        field3 = 1;

        method1();
        method2();
        method3();
    }

    public void method1() {
    }
    void method2() {
    }
    private void method3() {
    }
}
package packTest;

public class B {
    public B(){
        A a = new A();
        a.field1 = 1;
        a.field2 = 1;
//        a.field3 = 1; //private필드 접근 불가
        
        a.method1();
        a.method2();
//        a.method3(); #private메소드 접근 불가
    }
}

패키지가 동일한 B클래스에서는 A클래스의 private를 제외한 필드와 메소드는 사용할 수 있다.

package packTest2;
import packTest.*;

public class C {
    public c(){
        A a = new A();
        a.field1 = 1;
//        a.field2 = 1; //default
//        a.field3 = 1; //private
        
        a.method1();
//        a.method2();
//        a.method3();
    }
}

패키지가 다른 C클래스에서 A클래스의 public을 제외한 필드,메소드는 사용할 수 없다.

protected 접근 제한자

pack1 패키지에 protecte로 선언된 필드, 생성자, 메서드가 있다.

package pack1;

public class A {
    protected String field;

    protected A() {
    }

    protected void method() {
    }
}

또 동일한 패키지의 클래스 B가 있다. 이 때에는 A 클래스에 얼마든지 접근 가능하다.

package pack1;

public class B {
    public void method(){
        A a = new A();
        a.field = "value";
        a.method();
    }
}

그런데 만약 다른 패키지에 있다면? 접근 불가능하다.

package pack2;
import pack1.A;

public class C {
    A a = new A();
    a.field = "value";
    a.method();
}

그런데 자식 클래스를 만들어서 자식 생성자에서 super()로 A생성자를 호출한다면 접근 가능하다.

package pack2;
import pack1.A;

public class D extends A {
    public D(){
        super();
        this.field = "value";
        this.method();
    }
}

Getter,Setter()

  • 멤버변수를 private나 protected로 제한하고, 간접적으로 멤버변수를 다룰 수 있는 메서드를 만든다.
  • 만약 상속을 통해 확장될 것이 예상되는 클래스라면 protected 멤버변수를 사용한다.
  • Getter메소드: 필드값을 가공한 후 외부로 전달한다.
  • Setter메소드: 매개값을 검증해서 유효한 값만 객체의 필드로 저장한다.

메소드 이름은 get/set + 필드이름(첫문자 대문자)형식으로 지정한다.

package packTest;

public class Car {
    private int speed;
    private boolean stop;

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        if (speed < 0) {
            this.speed = 0;
            return;
        } else {
            this.speed = speed;
        }
    }

    public boolean isStop() { //필드타입이 boolean이면 get이 아닌 is로 시작하는 것이 관례이다. 
        return stop;
    }

    public void setStop(boolean stop) {
        this.stop = stop;
        this.speed = 0;
    }
}
package packTest;

public class CarExample {
    public static void main(String[] args) {
        Car car = new Car();

        car.setSpeed(-50);
        System.out.println("현재 속도: " + car.getSpeed());

        car.setSpeed(50);

        if (!car.isStop()) {
            car.setStop(true);
        }
        System.out.println("현재 속도: " + car.getSpeed());
    }
}
package packTest;

public class Time {
    private int hour;
    private int min;
    private int sec;
    //외부에서 접근하지 못하게

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        if (hour < 0 || hour > 23)
            return;
        this.hour = hour;
    }

    public int getMin() {
        return min;
    }

    public void setMin(int min) {
        if (min < 0 || min > 59)
            return;
        this.min = min;
    }

    public int getSec() {
        return sec;
    }

    public void setSec(int sec) {
        if (sec < 0 || sec > 59)
            return;
        this.sec = sec;
    }
}
class Person{
    private int weight;
    int age;
    protected int height;
    public String name;

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }
}
class Student extends Person{
    public void set(){
        age = 30;
        name = "홍길동";
        height = 175;
//        weight = 99;
        setWeight(99);
    }
}
public class InheritanceEx {
    public static void main(String[] args) {
        Student s = new Student();
        s.set();
        System.out.println("나이="+s.age);
        System.out.println("이름="+s.name);
        System.out.println("키="+s.height);
        System.out.println("몸무게="+s.getWeight());
    }
}
profile
github blog 쓰다가 관리하기 귀찮아서 돌아왔다

0개의 댓글