Backend
home

2024. 7. 17

인터페이스

두 장치를 연결하는 접속기, Java에서는 두 객체를 연결하는 역할을 한다.
public static final 특성을 갖는 불변의 상수 필드만을 가질 수 있다.
상수는 구현 객체와 관련 없는 인터페이스 소속 멤버이므로, 바로 접근해서 값을 얻을 수 있다.
일반 메서드는 default로 올 수 있다.
참고 사례
인터페이스도 참조 타입에 속하므로 타입이 될 수 있다.
인터페이스를 통해 구현 객체를 사용하려면 인터페이스 변수에 구현 객체를 대입해야 한다.
인터페이스는 추상 메서드를 멤버로 가질 수 있다.
인터페이스에서 선언된 추상메소드는 public abstract를 생략하더라도 자동으로 컴파일 할 수 있다.
정적 메소드는 public 또는 private으로 제한할 수 있으며, public 경우에는 접근 제한자 생략이 가능하다.
상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드는 모두 public 접근 제한을 갖는다.
public 을 생략하더라도 컴파일 과정에서 public 접근 제한자가 붙어 항상 외부에서 접근이 가능해진다.
정적 멤버, 인스턴스 멤버
정적 멤버 (정적 필드, 정적 메소드)
인스턴스 멤버 (필드, 메소드)
클래스.java (설계도) → 붕어빵 틀
클래스 c1 = new 클래스(); (c1 = 건물)
클래스 c2 = new 클래스(); (c2 = 건물)
인스턴스는 클래스를 통해 만들어진 고유의 객체
클래스(필드, 메소드, 생성자)
필드 : 값을 가짐
메소드 : 동작을 의미
예시 - 인스턴스 필드, 인스턴스 메소드
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 연봉 이상 받는 직원들 출력