인터페이스
•
두 장치를 연결하는 접속기, Java에서는 두 객체를 연결하는 역할을 한다.
•
public static final 특성을 갖는 불변의 상수 필드만을 가질 수 있다.
•
상수는 구현 객체와 관련 없는 인터페이스 소속 멤버이므로, 바로 접근해서 값을 얻을 수 있다.
•
일반 메서드는 default로 올 수 있다.
•
참고 사례
•
인터페이스도 참조 타입에 속하므로 타입이 될 수 있다.
•
인터페이스를 통해 구현 객체를 사용하려면 인터페이스 변수에 구현 객체를 대입해야 한다.
•
인터페이스는 추상 메서드를 멤버로 가질 수 있다.
•
인터페이스에서 선언된 추상메소드는 public abstract를 생략하더라도 자동으로 컴파일 할 수 있다.
•
정적 메소드는 public 또는 private으로 제한할 수 있으며, public 경우에는 접근 제한자 생략이 가능하다.
•
상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드는 모두 public 접근 제한을 갖는다.
•
public 을 생략하더라도 컴파일 과정에서 public 접근 제한자가 붙어 항상 외부에서 접근이 가능해진다.
•
정적 멤버, 인스턴스 멤버
◦
정적 멤버 (정적 필드, 정적 메소드)
◦
인스턴스 멤버 (필드, 메소드)
◦
◦
인스턴스는 클래스를 통해 만들어진 고유의 객체
◦
클래스(필드, 메소드, 생성자)
▪
필드 : 값을 가짐
▪
메소드 : 동작을 의미
▪
예시 - 인스턴스 필드, 인스턴스 메소드
int number = 1;
void print() { System.out.println("안녕하세요"); }
클래스 c = new 클래스();
c1.number;
c1.print();
c1.number = 2;
c2.number;
c2.print();
=> 각각의 인스턴스가 고유로 가지고 있음
Java
복사
▪
정적 필드, 메소드 활용법
static int number = 1;
클래스.number;
클래스.print();
Java
복사
•
인터페이스가 가질 수 있는 필드와 메소드의 종류 (시험 문제 참고)
◦
필드: 상수 필드 (public static final 자동으로 붙는다.)
◦
메소드:
▪
추상 메소드 : 실제 구현되어 있지 않은 중괄호가 없는 메소드
▪
디폴트 메소드 :
JAVA8+, 기본 구현 정의, 필요에 따라 구현 클래스에서 public 오버라이딩 하여 사용
▪
정적 메소드 :
JAVA8+, 독립적인 인터페이스의 메소드 (public, private)
•
public 정적 메소드 : 외부에서, 디폴트 메소드에서 쓰인다.
•
private 정적 메소드 : 디폴트 메소드, 정적 메소드에 쓰인다.
▪
private 메소드 : JAVA9+, 디폴트 메소드에 쓰인다.
•
Abstract 클래스 (Car)에서 상속받고 인터페이스(Temp) 한 개를 구현한 클래스
◦
L3, L5
public class L3 extends Car implements Temp {}
public class L5 extends Car implements Temp {}
Java
복사
•
상속 개념 재정리
◦
강제 형변환 기본 개념
▪
30평에서 18평으로 이사가게 되면 물건을 버리고 갈 수밖에 없음
◦
업캐스팅
▪
자식 클래스 객체가 부모 클래스 타입으로 형변환 되는 것
class Person{
String name;
Person(String name){
this.name = name;
}
}
class Student extends Person{
String check;
Student(String name){
super(name);
}
}
public class Main{
public static void main(String[] args){
Student s = new Student("홍길동");
Person p = s; // 업캐스팅
p.name = "이름이다.";
p.check = "컴파일 에러 발생"; // 컴파일 에러 발생
}
}
Java
복사
◦
다운캐스팅
▪
업캐스팅과 반대로 캐스팅 하는 것
•
하위 클래스로의 다운캐스팅을 할 때는 타입을 명시적으로 지정해줘야 함
Student s = (Student)p;
Java
복사
다중 인터페이스 구현
•
구현 객체는 하나이상의 인터페이스를 implements 할 수 있다. implements 뒤에 쉼표(,) 를 이용해 구분하여 작성하면 된다.
public class 구현클래스 implements 인터페이스A, 인터페이스B {
// 모든 추상 메소드 오버라이딩
}
Java
복사
•
두 인터페이스 타입의 변수에 각각 대입이 가능하다.
인터페이스A 변수A = new 구현클래스();
인터페이스B 변수B = new 구현클래스();
오브젝트 변수명 = new 오브젝트();
Java
복사
인터페이스 상속
•
인터페이스는 다른 인터페이스를 상속할 수 있다. 클래스와 달리 다중 상속을 허용한다.
public interface 인터페이스 extends 부모인터페이스1, 부모인터페이스2 { }
Java
복사
•
해당 인터페이스의 구현 클래스는 인터페이스가 가진 추상 메소드뿐만 아니라 부모 인터페이스가 가지고 있는 추상 메소드까지 모두 오버라이딩 해야 한다.
•
구현 객체는 자식과 부모 인터페이스 변수에 모두 대입될 수 있다.
인터페이스 변수A = new 구현클래스();
부모인터페이스1 변수B = new 구현클래스();
부모인터페이스2 변수C = new 구현클래스();
Java
복사
•
구현 객체가 자식 인터페이스 변수에 대입되면 자식과 부모 인터페이스의 추상 메소드 모두 호출 가능하나,
부모 인터페이스 변수에 대입되면 부모 인터페이스에서 선언된 추상 메소드만 호출 가능하다.
중첩 클래스 (Nested Class)
•
특정 클래스만 관계를 맺어야만 하는 경우 중첩 클래스로 선언한다.
•
멤버 클래스: 클래스의 멤버로서 선언되는 중첩 클래스 (인스턴스 멤버 클래스, 정적 멤버 클래스)
•
로컬 클래스: 메소드 내부에서 선언되는 중첩 클래스
•
인스턴스 멤버 클래스는 아래와 같이 선언된다.
package com.nestedclass.member;
public class A {
class NestedClass {
}
// 필드값으로 생성
NestedClass nc = new NestedClass();
// 생성자에서 생성 A() {
NestedClass nc = new NestedClass();
}
// 메소드에서 생성 void method() {
NestedClass nc = new NestedClass();
}
}
Java
복사
•
인스턴스 멤버 클래스는 주로 클래스 내부에서 사용되기 때문에 D처럼 private로 선언하는 것이 일반적이다.
•
생성자 또는 메소드의 매개변수나 내부에서 선언된 변수를 로컬 클래스에서 사용할 경우에는 로컬 클래스 내부에서 값을 변경하지 못하도록 제한되어 있다.
(final 특성을 갖게 된다)
•
로컬 클래스 내부에도 필드, 생성자, 메소드 선언이 올 수 있다. Java17부터 정적 필드와 정적 메소드의 선언도 가능하다.
•
학교 대신에 Company (회사이름)
•
학생 대신에 Employee (직원이름, 연봉)
•
직원 수는 최대 10명
•
입사 메소드
•
연봉 평균 메소드
•
연봉 합계 메소드
•
직원 정보 출력 메소드(int salary) → salary 연봉 이상 받는 직원들 출력