예제로 배우는 스프링 입문 1강(인프런)
- main메소드를 실행하여 애플리케이션 실행 가능
- 자바 애플리케이션으로 해당 애플리케이션을 띄우기 전에 꼭 메이븐 패키징을 해야한다. ./mvnw package
- 프런트 관련된 라이브러리를 생성하는 plugin이 동작을 해야 localhost에서 화면이 깨지지 않은 상태로 애플리케이션을 실행할 수 있다.
- 위의 과정들을 거친 이후에는 자바 애플리케이션을 실행하고 종료하는 식으로 애플리케이션 동작 가능
- spring petclinic 프로젝트를 clone 받아서 메이븐으로 빌드하고 인텔리제이로 읽어서 애플리케이션을 실행하는 방법
- 콘솔창에서 java jar 를 실행하는 방법
- intellij에서 petclinic 애플리케이션을 실행하는 방법
자바의 정석 ch7
6. 추상클래스(abstract class)
추상 클래스란?
- 일반 클래스와 같이 멤버변수와 생성자를 갖고 있지만, 추상 메서드를 갖고 있는 클래스
- 미완성 설계도
- 추상 클래스로는 인스턴스 생성 불가능, 상속을 통해서 자손 클래스만 인스턴스 생성할 수 있다.
- 일반 클래스와의 차이점은 단지 추상메서드를 포함하고 있는지 여부일 뿐임
추상 메서드(abstract method)
- 선언부만 작성하고 구현부는 작성하지 않은 상태
- 메서드의 내용이 상속받는 클래스에 따라서 달라질 수 있어서 구현부는 작성하지 않고, 주석을 달아서 어떤 기능을 수행하는지 적어준다.
- 추상 클래스를 상속받은 자손 클래스는 추상 메서드 부분을 완성해야한다.
- 자손 클래스에서도 모든 추상 메서드 부분을 완성하지 않을 경우 그 클래스도 추상 클래스가 된다.
- abstract 리턴타입 메서드이름();
- 추상 메서드는 필수 기능이라고 할 수 있다.
- 추상 메서드를 완성하지 않으면 인스턴스를 생성할 수 없기 때문, 강제적인 기능
- 일반 인스턴스 메서드 내부에서 추상메서드 호출 가능하다.
추상클래스의 작성
여러 클래스에 공통적으로 사용될 수 있는 클래스를 작성하기도 하고, 원래 있던 클래스들 중 공통적인 부분을 뽑아서 추상클래스로 만들기도 한다.
-
추상화(애매) : 클래스간의 공통점을 찾아내서 조상 클래스로 만드는 것
→ 추상화된 코드는 구체화된 코드보다 유연하다, 변경에 유리
-
구체화(명확, 구체적) : 상속을 통해 클래스 구현, 확장하는 것
-
추상메서드의 목적
- 자손 클래스에서 추상 메서드를 꼭 구현하도록 강요하기 위해서
(예제 코드는 개인 노션에)
- Unit 클래스에 있는 move() 가 추상 메서드로 선언된 이유는 Unit 클래스를 상속받아서 구현하는 클래스는 move()를 필수적으로 구현해야 한다는 의미이다.
- Unit[ ] group = new Unit[3];
- 처음에 이 코드 부분이 Unit 이 추상 클래스여서 인스턴스 생성이 불가능한데 실행 가능한 코드인가? 하는 의문이 들었다.
- 생각을 해보니, Unit 타입의 배열을 생성하면 Unit의 인스턴스들이 요소로 대입되는 것이 아니라, 일단 null 로 저장이 되고, 그 밑에 코드에서 요소별로 자식 인스턴스를 대입해주기 때문에 문제가 없는 것이다.
- for 문 안의 group[i].move()
- Unit 타입의 참조변수로 추상 메서드를 호출하더라도, 참조변수의 타입에 관계없이 실제 가르키고 있는 인스턴스의 메서드가 호출된다.
- 이 코드가 Unit 클래스의 추상메서드 move()를 호출한 것 같아 보이지만, 실제로는 Marine, Tank, Dropship 인스턴스의 메서드가 호출되는 것이다.
오늘 한 일
- 예제로 배우는 스프링 입문 수강 한 뒤에 김영한님의 스프링 입문 강의도 들어보자
- 예제로 배우는 스프링 입문 1강 수강 완료
- 자바의 정석 ch7 추상클래스 유튜브강의 수강 완료