관련 공부글
Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와
1. 객체의 특징객체(Object): 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중, 고유 속성을 가지고 있어 식별 가능한 것-> 속성과 동작[필드(Field)와 메서드(Method)]으로 구성되어 있음현실
keep-programming-study.tistory.com
2025.06.05 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)
Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)
1. 필드(Field)1) 필드의 개념 및 선언개념: 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 저장선언: 클래스 중관호 {} 블록 내부에 "타입 필드명( = 초기값);"과 같은 형식으로 선언-
keep-programming-study.tistory.com
Java 기초 또 다시 공부하기 10일차 - 객체 지향 프로그래밍(인스턴스 멤버와 정적 멤버, 패키지와
이전 공부글2025.06.04 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와 인스턴스 속성과 동작[필드(Field)
keep-programming-study.tistory.com
2025.06.12 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성)
Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성)
1. 상속 1) 상속의 정의이미 잘 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에, 중복되는 코드를 줄여줌-> 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오므
keep-programming-study.tistory.com
2025.06.13 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 12일차 - 상속(추상 클래스와 추상 메서드)
Java 기초 또 다시 공부하기 12일차 - 상속(추상 클래스와 추상 메서드)
1. 추상 클래스의 정의클래스들의 공통적인 필드와 메서드를 추출해서 선언하는 클래스객체를 직접 생성 가능한 실체 클래스와 상속 관계를 가지고 있음 -> 추상 클래스가 부모, 실체 클래스가
keep-programming-study.tistory.com
1. 인터페이스(Interface)
- 개발 코드와 객체가 서로 통신하는 접점 역할
-> 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위함 - 개발 코드가 인터페이스의 메서드를 호출하면, 인터페이스는 객체의 메서드를 호출
=> 개발 코드는 객체 내부 구조를 알 필요가 없고, 인터페이스의 메서드만 알고 있으면 됨 - 여러 객체들과 사용이 가능하므로, 사용 객체에 따라 실행 내용과 리턴값 다양화
1) 인터페이스 선언
- .java 형태의 소스 파일로 작성되고 컴파일러(javac)를 통해 .class 형태로 컴파일됨(물리적 형태는 클래스와 동일)
- [public] interface 인터페이스명 { ... }과 같이 선언
- 인터페이스명은 클래스명을 작성하는 방법과 동일
: 영어 대소문자를 구별하며, 첫 문자는 대문자로 하고 나머지는 소문자로 작성
(1) 상수 필드(constant field) 선언
- 인터페이스에는 실행 시 데이터를 저장할 수 있는 인스턴스 or 정적 필드 선언 불가
-> 상수 필드는 선언이 가능하지만, 인터페이스에 고정된 값으로 실행 시 데이터를 바꿀 수 없음 - 인터페이스에서 선언된 필드는 모두 public static final의 특징을 가짐
-> 타입 상수이름 = 값;만 입력해도 컴파일 과정에서 상수 필드로 인식됨 - 상수 필드에서 상수 이름은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우 언더바(_)로 연결하는 것이 관례
(2) 추상 메서드 선언
- 추상 메서드: 리턴 타입/메서드 이름/매개 변수만 기술하고 중괄호{}를 붙이지 않는 메서드
- 인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행
-> 인터페이스의 메서드를 실행 블록이 필요 없는 추상 메서드로 선언 - public abstract를 생략해도 컴파일 과정에서 추상 메서드로 인식됨
2) 인터페이스 구현
- 인터페이스의 구현(implement) 객체는
인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름/매개 타입/리턴 타입을 가진 실제 메서드를 갖고 있어야 함
-> 이 객체를 생성하는 클래스를 구현 클래스라고 함 - 인터페이스의 구현 객체가 인터페이스 변수에 대입됨
(1) 구현 클래스
- 인터페이스 타입으로 사용할 수 있음을 알려주기 위해, 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름 명시
- 인터페이스에 선언된 추상 메서드의 실체 메서드를 선언
public class 구현클래스명 implements 인터페이스명 {
// 인터페이스에 선언된 추상 메서드의 실체 메서드 선언
}
- 이클립스에서 실습
// Animal.java
package interfaces;
// 인터페이스 정의
public interface Animal {
void makeSound();
}
// Dog.java
package interfaces;
//구현 클래스 1
public class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
// Cat.java
package interfaces;
//구현 클래스 2
public class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("야옹~");
}
}
// Main.java
package interfaces;
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.makeSound(); // 출력: 멍멍!
cat.makeSound(); // 출력: 야옹~
}
}
(2) 다중 인터페이스 구현 클래스
- 다수의 인터페이스 타입으로 사용 가능
- 이클립스에서 실습
// Flyable.java
package interfaces;
//인터페이스 정의1
public interface Flyable {
void fly();
}
// Swimmable.java
package interfaces;
// 인터페이스 정의2
public interface Swimmable {
void swim();
}
// Duck.java
package interfaces;
//다중 인터페이스 구현 클래스
public class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("오리 날아요~");
}
@Override
public void swim() {
System.out.println("오리 헤엄쳐요~");
}
}
// DoubleInterface.java
package interfaces;
public class DoubleInterface {
public static void main(String[] args) {
Duck duck = new Duck();
duck.fly(); // 출력: 오리 날아요~
duck.swim(); // 출력: 오리 헤엄쳐요~
}
}
2. 인터페이스의 타입 변환과 다형성
- 인터페이스의 다형성:
인터페이스를 사용하여 메서드를 호출하도록 코딩했을 때, 구현 객체를 손쉽고 빠르게 교체하여 프로그램 실행 결과를 다양화
1) 자동 타입 변환
- 인터페이스의 자동 타입 변환(promotion): 구현 객체가 인터페이스 타입으로 변환되는 것
-> 프로그램 실행 도중 자동 타입 변환 - 인터페이스 구현 클래스를 상속하여 자식 클래스를 만들었다면, 자식 객체 역시 인터페이스 타입으로 자동 타입 변환 가능
인터페이스 변수명 = 구현객체; // 구현객체가 인터페이스로 자동 타입 변환
2) 강제 타입 변환
- 인터페이스의 강제 타입 변환(casting)
: 구현 클래스에 선언된 필드와 메서드를 사용해야 할 때,
이 방식으로 구현 클래스 타입으로 변환한 다음 구현 클래스의 필드와 메서드 사용 - 어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서 무작정 강제 타입 변환을 할 경우, ClassCastException 발생
-> 객체 타입을 확인하려면 다음과 같이 instanceof 연산자 사용(boolean 반환): 인터페이스변수명 instanceof 구현클래스
구현클래스 변수명 = (구현클래스) 인터페이스변수명; // 인터페이스변수가 구현클래스 타입으로 자동 변환
3) 인터페이스 필드의 다형성(이클립스 실습 예시)
- 인터페이스에서 필드의 다형성: 인터페이스 타입의 변수에 다양한 구현체를 넣고 호출
- 이클립스 실습 예시
// Vehicle.java
package interfaces;
//인터페이스 정의
public interface Vehicle {
void move();
}
// Car.java
package interfaces;
public class Car implements Vehicle {
@Override
public void move() {
System.out.println("자동차가 도로를 달립니다.");
}
}
// Boat.java
package interfaces;
public class Boat implements Vehicle {
@Override
public void move() {
System.out.println("보트가 물 위를 떠다닙니다.");
}
}
// TransportService.java
package interfaces;
public class TransportService {
// 인터페이스 타입의 필드
private Vehicle vehicle;
// 생성자 또는 메서드로 주입
public TransportService(Vehicle vehicle) {
this.vehicle = vehicle;
}
public void startTransport() {
vehicle.move(); // 다형적으로 실제 구현에 따라 동작
}
}
// ServicePrint.java
package interfaces;
public class ServicePrint {
public static void main(String[] args) {
TransportService carService = new TransportService(new Car());
TransportService boatService = new TransportService(new Boat());
carService.startTransport(); // 출력: 자동차가 도로를 달립니다.
boatService.startTransport(); // 출력: 보트가 물 위를 떠다닙니다.
}
}
4) 인터페이스 매개 변수의 다형성
- 인터페이스에서 매개 변수의 다형성: 어떤 구현체가 제공되느냐에 따라 메서드 실행 결과가 다양해지는 것
- 이클립스 실습 예시
: 본문의 1. 인터페이스(Interface) - 2) 인터페이스 구현 - (2) 다중 인터페이스 구현 클래스와 같으므로 생략
5) 인터페이스 상속
- 인터페이스도 다른 인터페이스를 상속 가능하며, 클래스와는 달리 다중 상속 허용
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2, ... { ... }
- 구현 클래스로부터 객체를 생성한 후, 하위 및 상위 인터페이스 타입으로 변환 가능
하위인터페이스 변수명 = new 구현클래스(...);
상위인터페이스1 변수명 = new 구현클래스(...);
상위인터페이스2 변수명 = new 구현클래스(...);
'자바(JAVA) > 미니 프로젝트 & 기초 공부' 카테고리의 다른 글
Java 기초 또 다시 공부하기 15일차 - 예외 처리(예외 클래스, 예외 처리) (1) | 2025.06.18 |
---|---|
Java 기초 또 다시 공부하기 14일차 - 중첩 클래스와 중첩 인터페이스(중첩 클래스와 중첩 인터페이스 개요, 익명 객체) (0) | 2025.06.17 |
Java 기초 또 다시 공부하기 12일차 - 상속(추상 클래스와 추상 메서드) (0) | 2025.06.13 |
Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성) (0) | 2025.06.12 |
Java 기초 또 다시 공부하기 10일차 - 객체 지향 프로그래밍(인스턴스 멤버와 정적 멤버, 패키지와 접근 제한자) (0) | 2025.06.11 |