◎ JAVA

◆ 상속 구현 시 염두해야 할 사항

1. 필드는 접근 제한 설정에 유의해야 한다

  • private은 상속 관계 없이 자신만 접근 가능
  • protected는 같은 패키지 + 자식 클래스들은 제한 없이 접근 가능
  • 상속은 50퍼 이상 비슷해야 사용하기에 좋다.
  • 상속은 1개의 상위 클래스만 상속 받을 수 있다.

2. 메서드는 재정의(override) 가능 여부를 결정해야 한다

  • final 키워드를 추가하면 메서드가 불변이 되어 재정의(override)가 불가능하다.
  • abstract 키워드를 추가하면 메서드를 무조건 재정의해야 한다
  • 아무 키워드를 붙이지 않으면 재정의 여부를 자식 클래스가 선택할 수 있다
  • 원하지 않는 것은 수정하기 위해서 같은 이름으로 한 개 더 생성하여 가린다.

3. 생성자

  • 객체를 만들 때 반드시 지켜야 하는 필수 데이터를 설정하는 코드

  • 부모 클래스의 생성자가 있다면 자식 클래스는 반드시 이를 고려해서 코드를 구현해야함

    	public class Phone {
    	//	private String number; //자식클래스에서 직접 접근이 안됨(절대적인 규칙)
    		protected String number; //자식클래스는 위치 무관하고 자유롭게 접근이 가능(개조 가능)
    
    		public void videoCall() {
    			System.out.println("영상통화 기능 실행");
    		}
    		public final void sms() {  //final를 추가하면 재정의(override)가 불가능하다.
    			System.out.println("문자 기능 실행");
    		}
    
    	//	휴대폰이라면 전화번호가 반드시 있어야 한다 ---> 생성자 구현
    		public Phone(String number) {
    			this.number = number;
    		}
    	}

◆ 메서드 오버라이드(method override, 메서드 재정의)

  • 기존 메서드의 코드가 마음에 들지 않아 다른 코드로 교체하고 싶을 때 사용

  • 부모 클래스에 있는 형태와 똑같이 구현 (이름까지도 똑같아야 함)

  • @Override와 같은 코드를 어노테이션(Annotation)이라고 한다.

  • @Override라는 명찰을 부착하여 하단 코드의 역할을 규정 해준다.

    	public class IPhone14 extends Phone {
    		public void info() {
    			//System.out.println("전화번호 : " + this.number); //내 클래스 것
    			//System.out.println("전화번호 : " + super.number); //부모 클래스 것
    			System.out.println("전화번호 : " + number); //this가 생략됨
    		}
    		@Override
    		public void videoCall() {
    			System.out.println("영상통화 기능을 사용할 수 없습니다");
    		}

-> 부모 클래스인 Phone에서 생성 시 필요한 number를 전달할 수 있는 생성자를 구현
-> 이 요구사항을 지키지 못하면 상속은 근본적으로 불가능하다.

			public IPhone14(String number) {
				super(number);  //부모 클래스의 생성자를 number를 전달한다!
			}
		}
  

◆ 추상 클래스(abstract class)

  • 상속을 위한 상위 클래스
  • 일반 클래스와 다른 점이 세 가지 있다.
  1. 클래스에 abstract라고 꼭 표시를 해야 한다.

  2. 객체 생성이 불가능하다.

  3. 추상 메서드를 가질 수 있다.

    public abstract class Mobile {
    	//필드 - 일반 클래스와 달라지는 부분이 없다
    	protected String number;
    	protected String color;
    
    	//생성자 - 일반 클래스와 동일
    	public Mobile(String color) {
    		this.color = color;
    	}

◆ 메서드

  • 추상 메서드와 일반 메서드로 구현

  • 추상 메서드는 이름은 아는데 내용을 모를 때 사용

  • 추상 메서드로 만들 경우 꼭 구현 해야한다.

  • 추상 메서드는 추상 클래스 안에서만 생성할 수 있다.

  • final을 사용하면 수정을 절대 할 수 없다. (final은 잘 사용하지 않는다.)

    		public abstract void call();
    		public abstract void sms();
    
    		public void output() {
    			System.out.println("번호 : " + number);
    			System.out.println("색상 : " + color);
    		}
    	}

◆ 다형성(polymorphism)

  • 상속 관계와 메서드 재정의를 이용해서 하나의 실행 코드로 다른 결과로 실행하는 것이다.
  • 서브 클래스의 객체를 슈퍼클래스로도 참조할 수 있고, 서브클래스로도 참조할 수 있다.
  • 다형성을 구현 하려면 상속 구조를 만들어야 한다.
  • 반드시 method override(메소드 재정의)를 해야한다.
  • Toy t1(참조 변수) 이기 때문에 Toy클래스를 갔다가 Crong의 메소드 재정의를 출력하게 된다.
  • 다형성의 특징을 사용하겠다는 것 = 자료형을 (업캐스팅)통합해서 사용하겠다는 것이다.
  • 다형성의 특징을 사용하지 않겠다는것 = 자료형을 있는그대로 쓰겠다는것

◆ 업캐스팅(up-casting)

  • 서브클래스로 생성된 객체를 슈퍼클래스로 변환하는 작업이다.
    → 객체가 바뀌는게 아니고 객체를 참조하는 형태가 바뀌는 것이다.
  • 장점 : up-casting은 서로 다른 서브클래스마다 별도로 해줘야 하는 작업을 묶어서 처리할 수 있게 해준다.

◆ private 접근 제한자

  • 해당 클래스 외에는 외부에서 사용할 수 없다.
  • 지정된 범위만 생성할 수 있도록 하는 것
  • getter, setter 생성해서 범위 설정 가능.

◆ protected 접근 제한자

  • 같은 패키지 또는 자식 클래스에서 사용할 수 있다.
  • 사용자가 원하는 범위로 자유롭게 지정 가능.
  • getter, setter를 생성하지 않음.

◆ 다중상속

인터페이스(interface)

-다중상속 전용 클래스
-상속에서 부모 클래스는 무조건 1개만 가능하다.
-클래스는 종류가 여러 가지가 있다.
= 클래스만 있는게 아니라 다중상속을 위한 또 다른 클래스가 존재한다.
= (다중상속을 위한 또 다른 클래스)인터페이스라고 부른다.
-상속에서 부모 클래스(+인터페이스)는 많을 수록 좋다.

  • 두 개를 동시에 고를 수 없는 것을 클래스로 구현한다.
  • 두 개를 동시에 고를 수 있는 것은 인터페이스로 구현한다.
public interface Singer {
//	필드 
//	- 인터페이스는 변수가 없다. (상수만 있으며, 키워드 생략 가능)
//	private int a; // 변수
//	public static final int a = 10; 	// 상수 : 변하지 않는 값
//	int a = 10;

//	생성자(constructor) 
//	- 필드가 없으니 생성자가 없다
//	public Singer() {}

//	메소드(method) 
//	- 오직 추상 메소드만 가질 수 있다(~java 7 까지)
//	- 키워드를 안적어도 자동 추가된다.(public, abstract)
//	- java 8부터는 default 메소드를 가질 수 있다(Lambda에 활용)
//	public abstract void sing() {}
	void sing();
}
  • 추상클래스는 여전히 extends로 한 개만 상속이 가능하다

  • 인터페이스는 implements 와 콤마로 여러 개 상속이 가능하다

    	public class Yu implements MC, Singer, Comedian {
    
    		@Override
    		public void gag() {
    		}
    		@Override
    		public void sing() {
    		}
    		@Override
    		public void talk() {
    		}
    	}

◆ 인터페이스(interface)

  • 익명 중첩 클래스를 사용하면 인터페이스도 객체가 생성된다.
profile
Backend Developer

0개의 댓글