인터페이스

  • 인터페이스 : 개발 코드와 객체가 서로 통신하는 접점 역할
  • 개발 코드가 인터페이스의 메소드를 호출 → 인터페이스는 객체의 메소드를 호출
  • 인터페이스를 통해 개발 코드를 수정하지 않아도 사용하는 객체를 변경하는 방법을 통해 실행 내용과 리턴값을 다양화 할 수 있다.

 

https://velog.io/@jaeseok-go/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

 

인터페이스 선언

  • 인터페이스의 물리적 형태는 클래스와 동일하다. 그러나 소스를 작성할 때 선언하는 방법에 클래스와 차이가 있다.
  • 인터페이스 이름은 클래스 이름을 작성하는 방법과 동일하다. ( 첫 글자를 대문자로 나머지는 소문자로)
  • 인터페이스는 class 키워드 자리에 interface 키워드를 사용한다.

  • 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 갖는다.
  • 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.

 

 

https://link2me.tistory.com/1742

 

상수 필드 선언 

  • 인터페이스는 데이터를 저장할 수 없기 때문에 상수 필드만 선언할 수 있다.
  • 상수 필드는 기본적으로 public static final 특성을 갖는다.
  • 관례적으로 필드 이름은 모두 대문자로 작성해야 하며, 선언 시 초기값을 대입해야 한다.

추상 메소드 선언

  • 인터페이스로 호출된 메소드는 객체에서 실행되므로 추상 메소드로 선언한다.
  • public abstract가 생략되고 메소드 선언부만 있는 추상 메소드 형태이다.
  • 구현 클래스는 반드시 추상 메소드를 재정의해야 한다.

 

 

인터페이스 구현

  • 인터페이스에서 객체의 메소드를 호출할 때, 객체는 인터페이스에 정의된 추상 메소드와 동일한 메소드 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 가지고 있어야 한다.
  • 이런 객체를 인터페이스의 구현(implement)객체라고 하고, 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.

 

① 구현 클래스

  • 보통의 클래스와 동일한데, 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시한다.
  • 그리고 인터페이스에 선언된 추상 메소드의 실체 메소드를 선언해야 한다.
  • 주의점 : 인터페이스의 모든 메소드는 기본적으로 public 접근 제한을 갖기 때문에, public보다 낮은 접근 제한으로 작성할 수 없다.
  • 인터페이스로 구현 객체를 사용하려면 다음과 같이 변수를 선언하고 구현 객체를 대입해야 한다.

 

② 다중 인터페이스 구현 클래스

 

https://velog.io/@00yubin00/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface

 

  • 객체는 그림과 같이 다수의 인터페이스 타입으로 사용할 수 있다.
  • 구현 클래스는 모든 인터페이스의 추상 메소드에 대해 셀체 메소드를 작성해야 한다. 

 

인터페이스 사용

  • 클래스를 선언할 때 인터페이스는 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언될 수 있다.
  • 인터페이스가 필드 타입으로 사용될 경우 : 필드에 구현 객체를 대입할 수 있다.
  • 인터페이스가 생성자의 매개 변수 타입으로 사용될 경우 : new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입할 수 있다.
  • 인터페이스가 로컬 변수 타입으로 사용될 경우 : 변수에 구현 객체를 대입할 수 있다.
  • 인터페이스가 메소드의 매개 변수 타입으로 사용될 경우 : 메소드 호출 시 구현 객체를 매개값으로 대입할 수 있다.
  • 대입이 된 후에는 재정의된 구현 객체의 메소드를 호출할 수 있다.

'Coding > Java' 카테고리의 다른 글

[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09
[24] JAVA 타입 변환과 다형성  (0) 2022.12.06
[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[20] JAVA 상속  (0) 2022.11.30

추상 클래스

추상(abstract) : 실체 간에 공통되는 특성을 추출한 것

추상 클래스 : 실체 클래스들의 공통적인 특성(필드와 메소드)을 추출해서 선언한 클래스. 

실체 클래스 : 객체를 직접 생성할 수 있는 클래스

https://www.proprofs.com/quiz-school/story.php?title=abstract-classes

 

추상 클래스의 용도

① 공통된 필드와 메소드의 이름을 통일할 목적

  • 실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.
  • 데이터와 기능이 동일한 필드나 메소드를 추상클래스에서 선언해줌으로써 더 간결하고 효율적인 코드 작성이 가능하다.

② 실체 클래스를 작성할 때 시간 절약

  • 공통되는 필드와 메소드를 추상클래스에 선언하면 다른 점만 실체 클래스에 선언하면 되기때문에 시간을 절약할 수 있다.
  • 일반적으로 개발 프로젝트에서 설계자와 코더는 다른 일을 수행하는데, 코더가 작성해야 할 클래스가 다수이고 이 클래스들이 동일한 필드와 메소드를 가져야 한다면 , 설계자는 이 내용들을 추려내어 추상 클래스로 설계 규칙을 만드는 것이 좋다.
  • 그리고 코더에게 추상 클래스를 상속하는 실체 클래스를 만들도록 요구하면 된다.

 

추상 클래스 선언

  • 추상 클래스를 선언할 때에는 선언에 abstract 키워드를 붙여야 한다.
  • abstract가 붙여진 추상클래스는 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.
  • 따라서 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성해야 한다.
  • 추상 클래스는 새로운 클래스를 만들기 위해 부모 클래스로만 사용된다. 즉, 실체클래스를 만들 때 extends 뒤에만 붙을 수 있다.

 

추상 메소드와 재정의

  • 추상 클래스에는 메소드가 있을 수도 없을 수도 있다.
  • 그런데 만약 추상 메소드가 있다면, 꼭 추상 클래스 안에 선언되어야 한다.
  • 추상 클래스에서 메소드의 선언만 통일하고 실행 내용이 실체 클래스마다 다를 경우 추상 메소드를 선언할 수 있다.
  • 추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호{}가 없는 메소드이다.
  • 자식 클래스(실체 클래스)는 반드시 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다.

위의 예시를 보면, Animal 이라는 추상클래스에서 추상 메소드 sound() 를 선언했다. 이유는 동물들 마다 울음 소리가 다르기 때문에, 이 부분은 하위 클래스 마다 고유한 소리를 내도록, 즉 Dog 클래스 에서는 '멍멍'으로 실행이 되도록, Cat 클래스 에서는 '야옹'이 실행되도록 하기 위함이다. 하위 클래스인 Dog, Cat에서는 sound() 메소드를 재정의해서 사용한다.

 


※ 추상 클래스에대해 알아보다 인터페이스와의 차이에 대한 내용을 찾게되었는데, 다음에 공부할 내용인 인터페이스라 읽어 보면 좋을 것 같아서 참고용으로 가져와 봤다.

 

https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-java/

 

Difference between Abstract Class and Interface in Java

Abstract class vs Interface 

  • Type of methods: Interface can have only abstract methods. An abstract class can have abstract and non-abstract methods. From Java 8, it can have default and static methods also. From Java 9, it can have private concrete methods as well.
  • Final Variables: Variables declared in a Java interface are by default final. An abstract class may contain non-final variables.
  • Type of variables: Abstract class can have final, non-final, static and non-static variables. The interface has only static and final variables.
  • Implementation: Abstract class can provide the implementation of the interface. Interface can’t provide the implementation of an abstract class.
  • Inheritance vs Abstraction: A Java interface can be implemented using the keyword “implements” and an abstract class can be extended using the keyword “extends”.
  • Multiple implementations: An interface can extend one or more Java interfaces; an abstract class can extend another Java class and implement multiple Java interfaces.
  • Multiple Inheritance:  Interface supports multiple inheritance; an abstract class does not support multiple inheritance.
  • Accessibility of Data Members: Members of a Java interface are public by default. A Java abstract class can have class members like private, protected, etc.

'Coding > Java' 카테고리의 다른 글

[24] JAVA 타입 변환과 다형성  (0) 2022.12.06
[23] JAVA 인터페이스  (0) 2022.12.04
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[20] JAVA 상속  (0) 2022.11.30
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29

 

  • 기본 타입 변환 처럼 클래스에서도 타입 변환이 있다.
  • 다형성 : 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질 
  • 다형성을 구현하려면 상속, 메소드 재정의타입변환이 필요하다.

1. 자동 타입 변환

  • 자동 타입 변환(promotion)이란 ? 프로그램 실행 도중에 자동으로 타입 변환이 일어나는 것
  • 클래스의 변환은 상속 관계에 있는 클래스 사이에서 발생한다.

  • 자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것
  • 따라서 자식은 부모 타입으로 자동 타입 변환이 가능하다.
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입 이라면 자동 타입 변환이 일어날 수 있다.
  • 즉, 아래의 그림에서 D객체는 바로 위의 부모인 B타입으로 자동 타입 변환이 될 수도 있고, A 타입으로 자동 타입 변환이 될 수 있다.

 

https://hyuntaekhong.github.io/blog/java-basic21/

 

  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
  • 그러나 예외가 있는데, 메소드가 자식클래스에서 재정의 되는 경우이다. 이땐 자식 클래스의 메소드가 대신 호출된다. (다형성)

출처 : <혼자 공부하는 자바>

  • Child 객체는 method3() 메소드를 가지고 있지만, Parent 타입으로 변환된 이후에는 method3()을 호출할 수 없다.
  • 그러나 부모와 자식 모두에게 있는 method2()는 재정의를 통해 타입 변환 이후에도 호출이 가능하다.

 

 

2. 필드의 다형성

  • 자동 타입 변환이 왜 필요할까? 다형성을 구현하기 위해서이다.
  • 다형성을 구현하는 법 : 상속 + 재정의 + 타입 변환
  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다. 
  • 자식 클래스는 부모의 메소드를 재정의해서 메소드의 실행 내용을 변경함으로써 더 우수한 실행 결과가 나오게 할 수 있다.

  • 예를 들어, 부모 클래스인  Tire의 필드값을 자식 클래스인 HankookTire에서 필드값을 교체함으로써 부모클래스의 메소드를 수정하지 않아도 자식클래스에서 다양한 메소드를 실행할 수 있는 것! 
  • 더보기
    Tire 클래스가 Car 클래스와 같은 패키지에 있다고 가정하자. 그렇다면 Car 클래스는 Tire클래스를 사용할 수 있다. 그래서 Car 클래스에서 Tire클래스로 각 바퀴에 대한 객체를 만들었다. 바퀴의 수명이 다하면 새로운 객체로 바꿔주려고 한다. Tire 클래스를 부모 클래스로 하는 자식 클래스 Hankook과 Kumho 를 만들고 타이어 교체시기가 되면 해당 위치의 타이어를 hankook이나 kumho 클래스로 새로운 객체를 만들어서 교체해줄 수 있다. 이때 hankook과 kumho 클래스의 roll을 재정의했을 경우 이전에 사용했던 roll과는 다르게 작동한다. 이렇게 다양한 자식 객체를 넣어 결과가 달라지는 것을 다형성이라고 한다.

 

 

 

3. 매개 변수의 다형성

  • 자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만, 주로 메소드를 호출할 때 많이 발생한다.
  • 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다. 
  • 매개 변수의 다형성은 매개값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행결과가 다양해 질 수 있다.
  • 자식 객체가 부모의 메소드를 재정의 했다면 재정의된 메소드를 호출함으로써 메소드의 실행결과가 다양해 진다.

 

 

 

4. 강제 타입 변환

  • 강제 타입 변환(casting) : 부모 타입을 자식 타입으로 변환하는 것
  • 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때만 적용된다.
  • 자식 타입이 부모 타입으로 자동 타입 변환하면, 부모에 선언된 필드와 메소드만 사용 가능한데,
  • 만약 자식에 선언된 필드와 메소드를 사용하고 싶다면, 자식 타입으로 다시 강제 타입 변환해서 자식의 필드와 메소드를 사용한다.

 

 

 

 

5. 객체 타입 확인

  • 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연산자를 사용한다.
  • instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용된다.
  • 메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 확인하고 안전하게 강제 타입 변환을 해야 한다.
  • 만약 타입을 확인하지 않고 강제 타입 변환을 시도하면 - ClassCastException이 발생할 수 있다.
// 사용법
boolean result = 객체 instanceof 타입

// Parent가 부모 클래스고 Child가 자식 클래스라고 가정하자.
Parent parent = new Parent();

// parent라는 객체가 Child로부터 만들어진 객체냐?
parent instanceof Child // false // classcastexception 발생

// Child 객체가 자동 타입 변환으로 parent에 대입됨
Parent parent = new Child();

// 활용법
public void method(Parent parent){
    // parent는 child 객체가 자동 타입 변환된 경우이므로 true
    if (parent instanceof Child){
        // 강제 타입 변환 조건에 맞으므로 강제 타입 변환 가능
        Child child = (Child) parent;
    }
}

참고자료

 

'Coding > Java' 카테고리의 다른 글

[23] JAVA 인터페이스  (0) 2022.12.04
[22] JAVA 추상클래스  (0) 2022.12.03
[20] JAVA 상속  (0) 2022.11.30
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27

1. 상속이란 ? 

  • 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 방법.
  • 다시 말해, 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 하는 것.
  • 따라서 중복이 되는 코드를 줄여줄 수 있고, 개발 시간을 절약해 주기 때문에 효율적이고, 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오기 때문에 유지 보수 시간을 최소화할 수 있다는 장점이 있다.
  • 부모 클래스를 상위 클래스, 자식 클래스를 하위 클래스 또는 파생 클래스라고 부른다.

 

2. 클래스 상속

  • 프로그램에의 상속은 자식이 부모를 선택한다.
  • 선택된 부모클래스는 extends 뒤에 기술한다.
  • 단 하나의 부모클래스만 상속할 수 있다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 부모 클래스와 자식 클래스의 패키지가 다르다면, default 접근 제한을 갖는 필드와 메소드도 상속대상에서 제외된다.

 

3. 부모 생성자 호출

  • 모든 객체는 클래스의 생성자를 호출해야만 생성된다.
  • 부모 생성자는 자식 생정자의 맨 첫 줄에서 호출된다.
  • super();는 부모의 기본 생성자를 호출한다.
  • 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성한다.

  • super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. - 일치하지 않으면 컴파일에러
  • super(매개값, ...)는 반드시 자식 생성자 첫 줄에 위치해야 한다. - 아니면 컴파일 에러 발생

 

4. 메소드 재정의 (Overriding)

  • 자식 클래스에서 부모 클래스의 메소드를 사용하기 적합하도록 수정해서 사용하는 방법.
  • 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것

① 메소드 재정의 규칙

  1. 부모의 메소드와 동일한 시그너처 ( 리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
  2. 접근 제한을 더 강하게 재정의할 수 없다.
  3. 새로운 예외(Exception)를 throws할 수 없다.

※ 접근 제한을 더 강하게 재정을 할 수 없다 ? 

더보기
부모 메소드가 public 접근 제한을 가지고 있을 경우 재정의하는 자식 메소드는 default 나 private 접근 제한으로 수정할 수 없다는 의미. 단, 반대는 가능. 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public으로 접근 제한을 가질 수 있다.

 

@Override 어노테이션

  • 해당 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여 준다.
//부모 클래스

public class Calculator {
	double areaCircle(double r) {
    	System.out.println("Calculator 개체의 areaCircle()실행");
        return 3.14159 * r * r ;
    }
}

//자식 클래스 // 재정의

public class Computer extends Calculator {
    @Override //어노테이션 생략 가능
    double areaCircle(double r) {
    	System.out.println("Computer 객체의 areaCircle() 실행");
        return Math.PI * r * r;   
    }
}

//메소드 재정의 테스트

public class ComputerExample {
	public static void main(String[] args) {
    	int r = 20;
        
        Calulator calculrator = new Calculator();
        System.out.println(calculatro.areaCircle(r)); //314.159
        
        Computer computer = new Computer();
        System.out.println(computer.areaCircle(r)); //314.1592653589793
        
    }
}

 

③ 부모 메소드 호출

  • 자식 클래스에서 부모 클래스 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨진다.
  • 그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 한다면, 명시적으로 super 키워드를 븉여서 부모 메소드를 호출 할 수 있다.
  • super.부모메소드();

 

 

5. Final 클래스와 Final 메소드

  • 클래스와 메소드를 선언할 때 final 키워드가 지정되면 상속과 관련이 있다는 의미
  • final 클래스는 부모 클래스가 될 수 없다. 즉, 자식 클래스를 만들 수 없다.
  • final 키워드 때문에 최종적인 클래스가 되기 때문이다.
  • 마찬가지로, 부모 클래스 내부의 final 메소드도 최종적인 메소드가 되기 때문에 자식 클래스에서 재정의 할 수 없다.
//재정의 할 수 없는 final 메소드

public class Car {
    //필드
    public int speed;
    
    //메소드
    public void speedUp(){ speed += 1; }
    
    //final 메소드
    public final void stop() {
    	System.out.println("차를 멈춤");
    	speed = 0;
    }
}


public class SportCar extends Car {
    @Override
    public void speedUp(){ speed += 10; }
    
    @Override
    public void stop(){
    	System.out.println("스포츠카를 멈춤");   //stop()은 final 메소드기 때문에 재정의 할 수 없음
        speed = 0;
    }
}

 

 

6. protected 접근 제한자

  • protected 는 public과 default 접근 제한의 중간
  • 같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
  • 단, 자식 클래스에서 부모 클래스의 생성자를 호출할 때, new 연산자를 사용해서 직접 호출할 수 없고, super(); 를 이용해야 한다.

'Coding > Java' 카테고리의 다른 글

[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25

패키지(Package)

  • 자바에서는 클래스를 체계적으로 관리하기 위해 패키지(Package)를 사용한다.
  • 패키지의 물리적인 형태는 파일 시스템의 폴더이지만, 단순히 파일 시스템의 폴더 기능만 하는 것은 아니다.
  • 패키지는 클래스의 일부분으로 클래스를 유일하게 만들어 주는 식별자 역할을 한다.
  • 즉, 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다.
  • 형태는 : package 상위패키지.하위패키지.클래스

 

패키지 선언

  • 클래스를 작성할 때 해당 클래스가 어떤 패키지에 속할 것인지를 선언하는 것을 의미한다.
  • 패키지는 클래스의 일부이다. 이유는, 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스를 사용할 수 없기 때문! 
  • JDK 8 이전 버전에서는 패키지가 없는 클래스를 선언할 수 있었지만, JDK 11버전 이후 버전부터는 패키지가 없는 클래스를 생성하면 컴파일 에러가 뜬다.

① 패키지 이름의 규칙

  • 숫자로 시작해서는 안 되고, _ $를 제외한 특수문자를 사용할 수 없다.
  • java로 시작하는 패키지는 자바 표준 API에서만 사용하기 때문에 사용하서는 안된다.
  • 모두 소문자로 작성하는 것이 관례이다.
  • 참고로 여러 개발 회사들이 함께 참여하는 프로젝트의 경우 중복을 방지하기 위해 회사 도메인 이름으로 패키지를 만든다.

 

② import문

  • 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있따면 import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 한다.

 

  • 형식은 다음과 같다.
    • import 상위패키지.하위패키지.클래스이름;
    • import 상위패키지.하위패키지.*; (사용하고자 하는 클래스들이 동일한 패키지 소속일 경우 *을 사용)

 

  • import문은 패키지 선언과 클래스 선언 사이에 작성한다.
  • import문은 개수에 제한이 없고 얼마든지 추가할 수 있다.
  • 주의할 점은 상위패키지를 import했다고 해서 하위 패키지까지 impoprt되는 것은 아니라는 점
  • 즉, com.hankook과 com.hankook.project는 서로 다른 패키지로 인식된다.

 

 

※ 만약 서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import된 경우 컴파일에러가 발생한다.

  • 이 경우에는 정확하게 패키지가 포함된 클래스 전체 이름을 기술해야 한다.
  • 예를 들어, 두 패키지에 Tire라는 동일한 클래스명이 존재할 경우, 아래와 같이 전체 이름을 표기.
  • ex) sec06.exam02.hankook.Tire Tire1 = ....,  sec06.exam02.kumho.Tire Tire2 = ....

 

접근 제한자

  • 접근 제한자(Access Modifier)는 말 그래로 접근을 제한하기 위해 사용된다.
  • 여기서 접근이란, 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 의미한다.
  • 클래스와 인터페잇를 다른 패키지에서 사용 못하도록 막을 필요가 있을 경우 사용한다.
  • 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 하는 경우도 사용한다.
  • 클래스를 선언할 때 public을 생략했다면, 클래스는 defalut 접근 제한을 가진다.
  • 클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가된다. 

 

접근제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스

 

 

Getter와 Setter 메소드

  • 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막기위해 사용.
  • 그 이유는 외부에서 마음대로 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있기 때문
  • 예를 들면, 자동차 속력은 음수가 될 수 없는데 외부에서 음수로 변경할 경우 무결성이 깨진다고 할 수 있다.
  • 클래스를 선언할 때 가능하다면 필드를 private로 선언해서 외부로부터 보호하고, 필드에 대한 Setter와 Getter 메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋다.

 

Setter : 외부에서 값을 받아 필드를 변경하는 메소드

  • 필드는 외부에서 접근할 수 없도록 막고, 외부에서 메소드를 통해 필드에 접근하도록 하는 메소드
  • 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있도록 한다.

Getter : 필드의 값을 외부로 리턴해 주는 메소드

  • 메소드로 필드값을 가공한 후 외부로 전달하는 역할
  • 예를 들어 자동차의 속도를 마일에서 km단위로 환산해서 외부로 리턴해주는 getSpeed() 메소드를 다음과 같이 작성 할 수 있다.

'Coding > Java' 카테고리의 다른 글

[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[20] JAVA 상속  (0) 2022.11.30
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25
[16] JAVA 메소드  (0) 2022.11.24

+ Recent posts