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 연봉 이상 받는 직원들 출력