Java의 특성(추상화, 상속, 다형성, 캡슐화)

햐얀하늘·2023년 10월 21일
0

추상화

추상클래스

  1. 객체를 생성할 수 없는 클래스
  2. 추상 메서드를 갖는 클래스 -> 내용(구현부가 없는 메서드, abstract) => 반드시 자식 클래스에서 오버라이드 필요

특징

  • abstract 클래스는 상속 전용 클래스
  • 클래스 구현부가 없는 메서드가 있으므로 객체 생성이 안됨
  • 상위 클래스 타입으로 자식을 참조할 수 있음(다형성)
  • 조상 클래스에서 상속 받은 abstract 메서드를 재정의 하지 않으면 클래스 내부에 abstract 메서드가 있으므로 자식 클래스는 abstract 클래스가 되어야한다.

사용 이유? => 구현의 강제를 통해 프로그램의 안정성 향상

인터페이스

  • 완벽히 추상회된 설게도 : 모든 메서드가 추상 메서드
  • 모든 메서드가 public abstarct이며 생략 가능(public abstract가 생략)
  • 모든 멤버 변수가 public static final 이며 생략 가능(선언되는 변수는 모두 상수로 적용)
  • interface 키워드를 이용해 선언
  • 클래스에서 해당 인터페이스를 implements 키워드를 이용해 구현
public interface MyInterface {
	public static final int Member1 = 10;
    int Member2 = 10;
    
    public abstract void method1(int param);
    void method2(int param);
}
  • 인터페이스 extends를 이용해 상속가능(다중상속가능, 구현부가 없음)

  • 객체 생성이 불가능

  • 클래스가 인터페이스를 구현할 경우 extends 키워드가 아니라 implements 키워드를 이용
    ex) interface Shape{} / class Circle implements Shape{}

  • 인터페이스를 implements하는 하위 클래스는 추상 메소드를 반드시 오버라이딩 해야함
    ex)

interface Chef{
	void cook();
}

Class KFoodChef implements Chef {
	
    @Override
    public void cook(){
    	System.out.println("한식을 요리함.");
	}
}

abstract class JfoodChef implements Chef {

}
- 인터페이스 다형성 적용

클래스와 인터페이스 비교

클래스인터페이스
특징class 키워드를 사용해 정의 필드와 메서드, 생성자로 이루어짐interface 키워드를 사용해 정의 상수와 추상 메소드로 이루어짐 public static fianl생략, public abstract 생략
관계인터페이스 구현함클래스에 의해 구현
멤버 변수선언 가능상수만 가능
다중 상속하나의 클래스만 상속가능여러개의 인터페이스 상속 가능
다중 구현여러 인터페이스로 다중구현 가능
인스턴스생성 가능생성 불가
타입타입으로 사용 가능타입으로 사용가능

추상 클래스와 인터페이스 비교

추상 클래스인터페이스
객체 생성불가불가
일반 메소드가능불가
일반 필드가능불가(상수만 가능)
메서드abstract를 붙여야만 추상 메서드모든 메서드는 추상 메서드
언제 사용?- 추상적 클래스의 성격을 가질 때, 서로 유사한 클래스 사이에 코드를 공유하고 싶을때- 서로 관련 없는 클래스 사이에 공통적으로 적용되는 인터페이스를 구현하고자 할때 ex) Comparable, Serializable, 객체(클래스)의 성격보다는 어떤 기능을 구현하고 있다는 약속의 성격

|공통점|특정 기능의 구현을 강제하고자 할 때|특정 기능의 구현을 강제하고자 할 때|

상속이란?

어떤 클래스의 특성을 그대로 갖는 새로운 클래스를 정의한 것

예시

public class Person {
	String name;
    int age;
    
    public void eat() {
    	System.out.println("음식을 먹는다.");
    }
}
public class Student {
	String name;
    int age;
    String major;
    
    public void eat() {
    	System.out.println("음식을 먹는다.");
    }
    
    public void study() {
    	System.out.println("공부를 한다.");
    }
 }

이처럼 Student는 person 클래스의 method와 속성값과 동일한 것을 가지고 있다. 이를 상속으로 해결하면

public class Student extends Person {
	String major;
    
    public void study() {
    	System.out.println("공부를한다");
    }
}
  1. 자식 클래스는 부모 클래스의 멤버 변수, 메소드를 자신의 것처럼 사용가능
  2. 클래스 선어시 extends 키워드 명시 (단 다중 상속 안됨 -> extends에 하나의 클래스만 추가가능 2개이상 안됨)
  3. super 키워드 - 조상 클래스 생성자 호출

오버라이딩(재정의)

  • 상위클래스에 선언된 메서드를 자식 클래스에서 재정의
  • 메서드의 이름,반환형,매개변수(타입,개수,순서) 동일해야함
  • 하위 클래스의 접근제어자 범위가 상위 클래스보다 크거나 같아야함
  • 조상보다 더 큰 예외를 던질 수 없다.
  • 메서드 오버로딩과 혼동X
public class Student extends Person {
	String major;
    
    public Student(String name, int age, String major) {
    	super(name,age);
        this.major = major;
    }
    
    
    public void study() {
    	super.eat();
    	System.out.println("공부를한다");
    }
    
    public void eat() {
    	System.out.println("지식을 먹는다");
    }
}

다형성이란?

  • 상속관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 참조할 수 있다.
    ex)
    Object ob = new Person("홍길동", 33); o
    Student st = new Person("이순신", 23); x

왼쪽이 오른쪽을 참조하는것
1. 왼쪽 조상(super) = 오른쪽 자식(child) => 묵시적 캐스팅

Person person = new Person();
Object obj = person;
  1. 왼쪽 자식(child) = 오른쪽 조상(super) => 명시적 캐스팅(형 변환 명시해야함)
Person person = new Student();
Student student = (Student)person;

형변환 생략 불가

캡슐화란?

  • 관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하도록 은닉하는게 핵심
  • 객체에 직접적인 접근을 막고 외부에서 내부의 정보에 직접 접근하거나 변경할 수 없고, 객체가 제공하는 필드와 메소드를 통해서만 접근 가능

고로 캡슐화의 가장큰 장점=> 정보 은닉

이 때문에 접근제한자가 필요함

접근 제한자

  • 클래스, 멤버 변수, 메서드 등의 선언부에서 접근 허용 범위를 지정하는 역할의 키워드
  1. 접근 제한자 종류
  • public : 모든 위치 접근 가능
  • protected : 같은 패키지에서 접근 가능, 다른패키지 접근 불가(단 다른 패키지의 클래스와 상속관계가 있으면 접근 가능)
  • default : 같은 패키지에서만 접근 가능, 접근 제한자가 선언이 안되었을 경우 기본적용
  • private : 자신 클래스에서만 접근 허용
    단 외부 클래스는 default와 public만 사용
  • static : 클래스 레벨의 요소 설정
  • final : 요소를 더이상 수정할 수 없게
  • abstract : 추상 메서드 및 추상 클래스 작성
수식어클래스 내부동일 패키지(다른 패키지내의) 하위클래스다른 패키지
privateO
(default)OO
protectedOOO
publicOOOO
  1. getter/ setter
    클래스에서 선언된 변수 중 접근 제한에 의해 접근할 수 없는 변수의 경우 다른 클래스에서 접근할 수 없기 때문에, 접근하기 위한 메서드(설정자와 접근자)를 public으로 선언해 사용
profile
나는 커서 개발자가 될거야!

0개의 댓글