1) 메소드의 다형성 - 오버로드(같은 이름의 여러 메소드)
2) 참조변수의 다형성 - 한 클래스의 참조변수로 여러 클래스의
인스턴스를 저장하는 것.
참조변수의 다형성은 상속관계에서만 나타남!
부모클래스의 참조변수로 자식클래스로 만든 인스턴스를 저장할
수 있다.
문형) 부모클래스명 참조변수 = new 자식클래스명();
부모클래스의 이름은 빌릴 수 있지만, 본 내용은 자식이기 때문에
부모의 참조변수로는 사용에 제한이 있다.(본인 확인 필요)
부모클래스의 참조변수로는 부모클래스에 정의된 멤버만 사용 가능.
실제 사용 시에는 다시 원래의 형태로 복원해야 한다.
부모클래스의 참조변수에 저장하는 것 - up casting
원래의 인스턴스로 되돌리는 것 - down casting
클래스는 '사용자(개발자) 정의 자료형'이라고 한다.
즉 형변환을 할 수 있다.
참조 변수의 크기는 고정는 고정되어 있어도 인스턴스 별로 구분하여 저장가능
객체의 형변환 조건)
1. 객체의 경우 상속관계에서만 형변환이 가능하다.
2. 부모클래스의 인스턴스는 자식클래스의 참조변수에 저장할 수
없다.(down casting은 반드시 up casting한 인스턴스만!)
부모인스턴스 -> 자식참조변수 (X)
자식인스턴스 -> 부모참조변수 -> 자식참조변수 (O)
다운캐스팅을 해서 사용할 때 인스턴스가 어떤 자식 클래스로 만들어져 있는지 확인하기 위해서 사용
instanceof 연산자 : 인스턴스가 어떤 클래스로 만든 건지 확인하는 명령어(true/false) - 조건식에서 사용
인스턴스명 instanceof 클래스명
* 내가 만든 코드만 쓰는 것이 아니기 때문에 상속을 배우는 것
다형성과 추상화는 상속이 기본 전제로 작용될 수 있다.
객체 지향 특성
1. 캡슐화 2.상속 3. 다형성 4. 추상화: 개념의 클래스화, 상속과 연관된 특성
제어자 7가지
비접근 제어자 - static, final, abstract
추상화(Abstract)
알고 있으나 정확하게 설명하기 어려운 것을 표현하는 것 -> 추상적 표현
개념을 정의한 객체를 작성하는 것 -> 추상화
=> 추상 클래스(Abstract Class)
상속 - 하위클래스로 공통적으로 사용하는 내용을 파생시키는 것
여러 객체에 공통적으로 사용하는 내용을 뽑아서 클래스화 할 때(상속),
처리해야하는 기능의 선언만 하고 실제 기능의 정의는 상속 받은 하위 클래스에서 작성하는 형태(오버라이딩)를
추상화라고 한다.
부모클래스에서는 선언만, 실제로 처리하는 곳은 하위클래스
예)
상위클래스(동물) - 동물은 소리를 낸다(어떤 소리?)/ 정확하게 정의하기 어려움(추상화)
하위클래스(강아지) - 강아지는 멍멍하고 소리를 낸다.(구체화)
순서
정의하지 못하는 메소드 - 추상 메소드
추상 메소드를 포함하고 있는 클래스 - 추상 클래스
추상클래스(Abstract Class) '미완성 설계도' - 인스턴스 생성 불가
다른 실제 클래스를 작성하는데 도움을 주는 게 목적인 클래스
접근제어자 자료형 메소드명(매개변수목록) -> 선언부
-----------------------------------------------------------------------
{
..........
} -> 정의부
추상메소드(Abstract Method)
추상 메소드는 선언부만 작성한 메소드
자료형 앞에 abstract 제어자(키워드)를 붙이고 선언만 한 메소드
추상 메소드는 반드시 상속한 하위 클래스에서 재정의(override)해야 한다.
예)
하위클래스를 만들때 꼭 생성해야 한다.
public class AbstractTestClass {
public static void main(String[] args) {
// 추상 클래스이기 때문에 인스턴스가 만들어 지지 않는다.
// Animal ani = new Animal(); 인스턴스 생성불가
Monkey mong = new Monkey();
mong.howl();
Cat cat = new Cat();
cat.howl();
Dog dog = new Dog();
dog.howl();
}
}
//추상 클래스(부모 클래스)
abstract class Animal { // 추상메소드를 만들면, abstract를 붙여 주어야 한다.
String name;
int age;
String gender;
abstract void howl(); // 추상 메소드, ;꼭 찍기
void sleep() { //일반 메소드
System.out.println("잔다.");
}
}
// 자식클래스, 하위클래스
class Monkey extends Animal {
// 부모클래스의 abstract void howl();추상 메소드 부분
@Override
void howl() {
}
}
class Cat extends Animal {
@Override
void howl() {
System.out.println("야옹~");
}
}
class Dog extends Animal {
@Override
void howl() {
System.out.println("멍멍!");
}
}
인터페이스(Interface)
추상화 정도가 더 심한 클래스
모든 메소드가 정의되지 않은 클래스(모든 메소드가 추상 메소드)
인스턴스를 생성할 수 없다.
목적은 클래스 작성의 표준을 제시하는 것
추상메소드 + 상수(final 변수) = 인터페이스(Interface)
class라는 키워드를 사용하지 않고 interface를 사용
작성) ineterface 인터페이스명 {.....}
작성법
1. class 대신 interface사용
2. 모든 메소드는 추상 메소드이기 때문에 , 앞에 public abstract가 붙어야 한다.
메소드 정의부는 정의하지 않는다.
3. 모든 변수에 public abstract final이 붙는다.
4. public abstract, public static final은 생략할 수 있다.
변수만 쓰여 있는 경우는 무조건 상수라고 보면 된다.
5. 인터페이스를 상속받을 때는 extends가 아닌 implements 키워드를 사용한다.
ArrayList 클래스는 List 인터페이스의 자식 클래스
List의 자식 클래스에는 LinkedLIst도 있음
파라미터로 목록을 전달할 때나 반환값을 받아주는 참조변수는 부모 인터페이스를 사용
list의 인터페이스로 하위작성됨
array 순차 배열, 저장공간이 필요, linked 링크(주소값)로 연결되기 때문에 저장공간이 여유로움
public class AbstractTestClass {
public static void main(String[] args) {
// TestInterface tif = new TestInterface(); 인스턴스 생성불가
System.out.println(TestInterface.A);// 상수 사용 가능
TestImp ti = new TestImp();
ti.method1();
System.out.println(ti.D);
// 부모 인터페이스 참조변수로 자식 클래스의 인스턴스 저장 가능, up casting
TestInterface tif2 = ti; //다형성
}
}
interface TestInterface {
// 모든 것은 상수다!
public static final int A = 10; //정식 표현
final int B = 20; // public static 생략
static int C = 30; // public final 생략
int D = 40; // public static final 생략
// 모든 메소드는 추상 메소드다.
public abstract void method1();
public void method2();// abstract 생략
void method3(); // public abstract 생략
}
class TestImp implements TestInterface {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
제어자의 대상
1. 클래스 - 접근제어자(4가지), abstract, final(상속할 수 없는 클래스가 됨)
2. 메소드 - 접근제어자(4가지), abstract, final(오버라이딩 대상에서 제외, 재정의불가), static(인스턴스 없이도 사용가능)
3. 멤버변수 - 접근제어자(4가지), final(상수로 만들 수 있다.), static
4. 지역변수 - final
제어자 조합 규칙
1. 메소드에 static과 abstaract를 함께 사용할 수 없다.
static - 인스턴스 없이 사용가능
abstract - 정의부가 없음,
2. 클래스에 abstract와 final을 함께 사용할 수 없다.
abstract - 반드시 상속을 해야 한다.
final - 상속을 할 수 없다.
3. abstract메소드의 접근제어자에 private를 쓸 수 없다.
private - 상속할 수 없다.
abstract - 상속하여 재정의 해야하는 메소드
4. 메소드에 final과 private를 같이 사용할 필요는 없다.
둘 다 상속불가.private 하나로 처리
final 제어자
1. 클래스 앞에 붙으면 상속할 수 없는 클래스
2. 메소드 앞에 붙으면 재정의(Override)할 수 없는 메소드로 지정
'공부기록 > Java' 카테고리의 다른 글
10월 15일 Java - eclipse (0) | 2023.10.15 |
---|---|
10월 14일 Java - eclipse (0) | 2023.10.14 |
4월 17일 Java - 객체지향의 특성 (0) | 2023.04.18 |
4월 13일 (2) Java - this, 생성자 오버로딩, 실습 (0) | 2023.04.13 |
4월 13일 (1) Java - 기타 제어자, 생성자 (0) | 2023.04.13 |