이번 시간에는 클래스의 캐스팅과 인터페이스에 대해 학습하고 기록했다.
- 업캐스팅
우선, 서브클래스의 객체는 슈퍼클래스의 멤버를 모두 가지고 있다.
서브클래스의 객체는 슈퍼클래스의 객체로 취급 가능하다
업캐스팅이란 "부모 클래스의 레퍼런스 변수로 자식 클래스 객체를 가리키게 되는 것"
이렇게 업캐스팅된 레퍼런스는 부모 클래스의 멤버만 접근 가능하다.
=> 서브 클래스 객체를 슈퍼 클래스의 타입으로 변환
class Person{
String name;
String id;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
String grade;
String department;
public Student(String name){
super(name);
}
}
public class UpcastingEx{
public static void main(String[] args){
Person p;
Student s = new Student("이재문");
p = s; //업캐스팅;
System.out.println(p.name); //부모의 멤버 접근 가능
p.grade = "A";//컴파일 에러 발생!!
}
}
- 다운캐스팅 (업캐스팅 후에 사용!)
업캐스팅은 자동적으로 되는 반면 다운캐스팅은 명시적으로 작성해줘야 한다.
=> 슈퍼 클래스의 객체를 서브 클래스 타입으로 변환
"슈퍼 클래스의 객체를 서브 클래스의 레퍼런스로 가리킨다."
class Person{
String name;
String id;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
String grade;
String department;
public Student(String name){
super(name);
}
}
public class UpcastingEx{
public static void main(String[] args){
Person p = new Student("이재문"); //업캐스팅 자동적으로 발생
Student s; // 서브 클래스의 레퍼런스 변수
s = (Student)p; //명시적으로 표현한 다운캐스팅
System.out.println(s.name); //접근 가능
s.grade = "A";
}
}
- instanceof 연산자
업캐스팅된 레퍼런스로 객체 판단 어려움 -> 매개변수에 (Person person)이런 경우 판단 어려움
따라서 instanceof 연산자를 사용한다. (객체레퍼런스 instanceof 클래스) 형식으로 쓴다.
리턴값은 boolean(true/false)값을 가진다.
예시) if("java" instanceof String) // 이는 true이다. String class의 레퍼런스 변수 "java"이다.
- 메소드 오버라이딩
오버로딩과는 다른 개념으로 리턴 타입, 매개변수 타입 및 개수, 메소드 이름까지 모두 동일해야 한다!
슈퍼 클래스의 메소드를 서브 클래스에서 재정의하는 것이다.
--동적 바인딩 발생: 서브 클래스에서 재정의한 메소드를 호출하는 것이 동적 바인딩이다.
class shape{
public void draw(){
System.out.println("Shape");
}
}
class Line extends Shape{
public void draw(){ //메소드 오버라이딩!
System.out.println("Line");
}
}
class Rect extends Shape{
public void draw(){
System.out.println("rect");
}
}
class Circle extends Shape{
public void draw(){
System.out.println("Circle");
}
}
Line line = new Line();
line.draw();// 오버라이딩된 함수 호출
Shape shape = new Line(); //업캐스팅 했다
shape.draw(); //Line클래스에서 재정의한 메소드로 호출한다! : 동적 바인딩
주의) 슈퍼 클래스 레퍼런스로 오버라이딩된 메소드 호출
오버라이딩의 목적 -> 다형성 구현!
오버라이딩 실현 시간 -> 오버라이딩은 실행 시간(런타임)에 실현된다! 실행 시간에 동적 바인딩!!
- 오버라이딩과 super 키워드 활용
서브 클래스에서 사용하는 것으로 슈퍼 클래스의 메소드를 호출할 때 사용된다.
정적 바인딩 이라고도 한다.
<오버로딩 vs 오버라이딩>
조건 : 오버로딩은 메소드 이름은 동일, 매개변수의 타입이나 개수가 같아야 한다. (메소드 리턴형 상관 X)
오버라이딩은 메소드의 이름과 매개변수 타입, 개수, 리턴형이 다 동일해야 한다!
접근 지정자: 오버라이딩을 하려면 접근 지정자는 슈퍼 클래스에서 선언된 것보다 범위가 작아질 수 없다.
- 추상
추상 메소드와 추상 클래스 둘 다 있을 수 있다.
abstract로 선언하고 사용한다. 2종류가 존재한다.
- 추상 메소드를 하나라도 가진 클래스 (class 앞에 abstract로 선언하여야 함)
- 추상 메소드가 없지만 abstract로 선언된 클래스
추상 클래스는 객체를 생성할 수 없다. / 레퍼런스 변수는 선언 가능하다!
이유: 추상 클래스 => 추상 메소드가 구현되어 있지 않다.
<상속 경우 2가지>
- 추상 클래스 단순 상속: 추상 클래스를 상속 받아서 추상 메소드를 구현하지 않으면 추상 클래스.
=> 서브클래스도 abstract붙여서 사용
- 추상 클래스 구현 상속: 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
=> 서브클래스는 추상 클래스 아님
abstract class shape{
public abstract void draw();
}
class Line extends shape{
@override
public void draw(){
System.out.println("Line"); //오버라이딩 통해서 추상 클래스 사용
}
}
-용도: 설계와 구현 분리 -> 슈퍼 클래스에서는 설계
-> 추상 클래스에서는 구현 //계층적 상속 관계에 유리
- 인터페이스
최소한의 규격을 선언하여 사용하는 것이다.
interface 키워드 사용
==> 인터페이스에는 필드를 선언할 수 없다./ 상수, default, private, static, 추상 메소드 가능
-상수: public static final 생략가능
-추상 메소드: public abstract 생략 가능
-default 메소드: public만 가능. 생략 가능
-private 메소드: static 가능
-static 메소드: public, private 가능. public만 생략 가능
---인터페이스는 객체 생성 불가 / 레퍼런스 변수 선언 가능하다! (추상 클래스와 연관)
-구현: 모든 추상 메소드를 반드시 구현해야 한다.
인터페이스끼리는 다중 상속이 가능하다 / 다른 인터페이스 상속 가능하다.
클래스에서 interface를 상속 받는 것이 아니라 구현하는 것!
implements 키워드를 사용한다.
다중 구현도 가능하다.
- <추상 vs 인터페이스>
추상: 서브 클래스에서 필요로 하는 대부분을 구현하여 두고 사용
인터페이스: 클래스의 목적에 따라 인터페이스의 모든 추상 메소드를 만들도록 하는 목적
==>> 둘 다 다형성을 위한 것임.
개념이 점점 많아지면서 디테일적으로 공부할 것이 많아지는 거 같다.
계속해서 기록하면서 이해 위주로 공부해야겠다.
중간고사 파이팅!
'자바기반응용프로그래밍' 카테고리의 다른 글
| 사용자 기반 카페 POS - 자바 GUI 개발 (0) | 2026.01.07 |
|---|---|
| 5. 클래스와 상속(2) (0) | 2025.09.30 |
| 4. 클래스와 상속(1) (0) | 2025.09.23 |
| 3. 자바 문법 (2) (0) | 2025.09.17 |
| 2. 자바 문법 (1) (1) | 2025.09.12 |