Java 강의 -객체 지향 문법 3 [즐거운 자바 강좌]

·2023년 8월 4일

java 공부

목록 보기
4/13
post-thumbnail

생성자

인스턴스를 생성할 때 사용한다.
어떤 값을 가지고 인스턴스가 만들어지게 하고 싶다면 생성자를 사용한다.
클래스 작성시 생성자를 하나도 만들지 않았다면 자동으로 기본 생성자가 생성된다.
기본 생성자는 매개 변수를 하나도 받지 않는 생성자를 말한다.

추상 클래스

  • 추상 클래스는 인스턴스가 될 수 없다.
  • 추상 클래스를 상속받는 자손이 인스턴스가 된다.
  • abstract 키워드를 사용하여 클래스를 정의한다.
  • 추상 클래스는 보통 1개 이상의 추상 메소드를 가진다.
  • public abstract class 클래스명 {....}

템플릿 메소드 패턴으로 배우는 추상 클래스

  • 추상 클래스 자식 클래스가 오버라이딩 못하도록 하는 키워드 final
EX. 상황 : 초기화와 마무리 코드는 그대로, 실행 코드는 변경 가능하도록 하는 상황

public abstract class Car { 

    protected final void init(){ //추상 X : 항상 그대로, 오버라이딩 불가
    System.out.println("초기화하는 코드");
    } 
    
	protected abstract run(){}; 추상 O : 자식이 무조건 오버라이딩 해서 사용
    
	protected final close(){ //추상 X : 항상 그대로, 오버라이딩 불가
    System.out.println("마무리하는 코드");
    } 

    //(템플릿 메소드)
    public void execute(){
    this.init();
    this.run();
    this.close();
    }
}

public class Bus extends Car{
	@Override
    run(){
    println("별도로 동작하는 코드 후륜구동");
   }
}

main 메서드 {
  Car c = new Bus();
  c.execute();
}
  • 템플리 메서드 : 실행 순서를 정해주는 메서드

final 클래스, 불변객체 String

  • 부모가 될 수 없는 클래스
    • 상속을 금지 시키려면 클래스를 정의할 때 final 키워드를 사용한다.
    pulbic final class 클래스명{...}
  • String 클래스는 final이다.
    String 클래스는 상속하는 것이 불가능하기 때문에 String 클래스가 String 클래스를 new로 참조하면 힙 메모리에 매번 새로운 객체가 생성되어 메모리가 낭비된다. 상수를 참조하는 것이 효율적이다.

접근 제한자

인터페이스

무슨 기능을 만들어야 할까 VS 구현부터 하기
-> 어떤 기능을 만들어야 할지부터 고민한다. 만들어야 할 기능들을 관련된 것끼리 묶은 후 이름을 지어준다. 기능 이름이 인터페이스다!

EX. public interface 인터페이스이름 {...}
  • 인터페이스 작성 문법
    • 인터페이스의 모든 필드는 public static final이어야 하며,
      모든 메서드는 public abstract이어야 한다.
    • java 8 부터는 디폴트와 정적 메서드도 선언이 가능합니다.
    • interface도 확장자가 .java파일로 작성한다.
  • 인터페이스의 default method (JDK 8에 추가된 메소드)

    • A라는 사용자가 메소드 3개가 선언된 interface를 작성한 후 외부에 공개하였다
    • 여러 사용자들이 해당 인터페이스를 구현해 이용하였다.
    • A라는 사용자가 인터페이스에 메소드 1개를 추가하였다.
    • 여러 사용자들이 라이브러리가 업데이트 된 줄 알고 업데이트 하였다.
      -> 사용자들에게 error가 난다.
      그래서 디폴트 메소드를 추가하여 상위 인터페이스를 변경해도 오류가 나지 않도록 한다.
  • 인터페이스의 static method (JDK 8에 추가된 메소드)

    • 인터페이스를 구현한 클래스가 없어도 사용 가능한 static method

팩토리 메소드 패턴과 Java Reflection

팩토리 메소드 패턴
→ SOLID의 OCP 개방-폐쇄 원칙, DIP 의존 관계 역전 원칙을 지키는 방법

클래스 로더를 이용한 인스턴스 생성하기

Class clazz = Class.forName("클래스풀네임");
Object obj = clazz.newInstance();

익명클래스와 처음 만나는 람다

이름 없는 클래스 (Anonymous Class)
→ 형태 : new 생성자(){...}
→ 추상 클래스의 자식 클래스로 오버라이딩 하여 구현하는 것이 아니라, 생성자 뒤에 중괄호가 나오고 코드를 오버라이딩 하여 보통 구현한다.

Car car = new Car(){
	Public void run(){
		System.out.println("Car를 상속 받는 이름 없는 객체가 run메소드를 오버라이딩함");
        

람다(Lambda) 인터페이스
: 메소드를 하나만 가지고 있는 인터페이스
→ 이름 없는 객체를 만들어서 전달 할 수 있다.
→ 람다 interface는 메소드를 한개 가지고 있다.
→ 람다 인터페이스를 사용하는 람다 표현식은 JDK 8에서 추가되었다.
→ JDK 8에 추가된 이러한 문법들을 사용할 때 보통 모던 자바라고 한다.
→ 나중에 Stream API와 엮여서 쓰이면 편리하게 코드를 작성할 수 있다.
< MyRunnable interface >

public interface MyRunnable {
    public void run();
}

< RunnableExecute class >

public class RunnableExecute {
    public void execute(MyRunnable myrunnable){
        myrunnable.run();
    }
}

< Main >

public class MyRunnableMain {
    public static void main(String[] args) {


        MyRunnable myRunnable = new MyRunnable() {
            @Override
            public void run() {
                System.out.println("Hello!!!!");
            }
        };
        
        RunnableExecute runnableExecute = new RunnableExecute();
        runnableExecute.execute(myRunnable);
    }
}

< 람다를 사용한 같은 결과 코드 >

public class MyRunnableMain {
    public static void main(String[] args) {

        RunnableExecute runnableExecute = new RunnableExecute();
        runnableExecute.execute(() -> {
                System.out.println("Hello!!!!");
            }
        );
    }
}
profile
기회를 잡기 위해 준비하자 !

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기