부모 메소드가 public 접근 제한을 가지고 있을 경우 재정의하는 자식 메소드는 default 나 private 접근 제한으로 수정할 수 없다는 의미. 단, 반대는 가능. 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public으로 접근 제한을 가질 수 있다.
② @Override 어노테이션
해당 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여 준다.
//부모 클래스
public class Calculator {
double areaCircle(double r) {
System.out.println("Calculator 개체의 areaCircle()실행");
return 3.14159 * r * r ;
}
}
//자식 클래스 // 재정의
public class Computer extends Calculator {
@Override //어노테이션 생략 가능
double areaCircle(double r) {
System.out.println("Computer 객체의 areaCircle() 실행");
return Math.PI * r * r;
}
}
//메소드 재정의 테스트
public class ComputerExample {
public static void main(String[] args) {
int r = 20;
Calulator calculrator = new Calculator();
System.out.println(calculatro.areaCircle(r)); //314.159
Computer computer = new Computer();
System.out.println(computer.areaCircle(r)); //314.1592653589793
}
}
③ 부모 메소드 호출
자식 클래스에서 부모 클래스 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨진다.
그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 한다면, 명시적으로 super 키워드를 븉여서 부모 메소드를 호출 할 수 있다.
super.부모메소드();
5. Final 클래스와 Final 메소드
클래스와 메소드를 선언할 때 final 키워드가 지정되면 상속과 관련이 있다는 의미
final 클래스는 부모 클래스가 될 수 없다. 즉, 자식 클래스를 만들 수 없다.
final 키워드 때문에 최종적인 클래스가 되기 때문이다.
마찬가지로, 부모 클래스 내부의 final 메소드도 최종적인 메소드가 되기 때문에 자식 클래스에서 재정의 할 수 없다.
//재정의 할 수 없는 final 메소드
public class Car {
//필드
public int speed;
//메소드
public void speedUp(){ speed += 1; }
//final 메소드
public final void stop() {
System.out.println("차를 멈춤");
speed = 0;
}
}
public class SportCar extends Car {
@Override
public void speedUp(){ speed += 10; }
@Override
public void stop(){
System.out.println("스포츠카를 멈춤"); //stop()은 final 메소드기 때문에 재정의 할 수 없음
speed = 0;
}
}
6. protected 접근 제한자
protected 는 public과 default 접근 제한의 중간
같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
단, 자식 클래스에서 부모 클래스의 생성자를 호출할 때, new 연산자를 사용해서 직접 호출할 수 없고, super(); 를 이용해야 한다.
스프링 부트(Spring Boot)는 스프링(Spring)을 더 쉽게 이용하기 위한 도구이다. 스프링 이용하여 개발을 할 때, 이것저것 세팅을 해야 될 요소들이 많은데, Spring Boot는 매우 간단하게 프로젝트를 설정할 수 있게 하여 Spring 개발을 조금 더 쉽게 만들어주는 역할을 한다.
User는 스프링을 사용하기 위해서 이것저것 다양한 설정을 직접 해줘야된다는 문제점이 있다. 개발자가 실행환경이나 의존성 관리 등의 인프라 관련 등에 쓰는 에너지가 소요되는데, 프로그래밍을 하는 데 있어 매우 중요한 비즈니스를 만들기 위한 프로그래밍에 조금 더 에너지를 투입할 수 있게 Spring의 많은 부분을 자동화하였고, 많은 개발자들이 현재 Spring Boot을 이용하여 개발을 진행하고 있다.
Spring Framework의 Controller는 사용자가 화면(View)단에서 입력이나 어떤 이벤트를 했을 경우, 그 이벤트에 맞는 화면(View)이나 비지니스 로직(Model)을 실행할 수 있도록 업데이트 해주는 역할을 한다. 즉, Model과 View를 연결해주는 다리 역할이라고 할 수 있다. 서버에서 기능별 URL이라는 API를 개설해 놓았고, 클라이언트는 필요한 정보를 얻기 위해 적절한 API에 요청한다. 즉 Controller는 이런 창구 역할을 하는 API들을 모아놓은 클래스라고 할 수 있다.
Front-end에서 들어오는 클라이언트 측의 요청이 가장 먼저 서버 측과 맞닿는 부분
Client의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 Service를 호출
클라이언트가 보낸 데이터가 있다면 Service를 호출할 때 전달하기 쉽게 데이터의 가공
모델의 업무 수행이 완료되면 그 결과를 바탕으로 화면을 구성하도록 View에 전달
@Controller 어노테이션을 사용하여 만들어진 컨트롤러 클래스에 라우팅(Routing)할 수 있도록 요청 URL에 대해 해당하는 메소드를 매핑해줄 수 있도록 하기 위해 @RequestMapping 어노테이션을 사용한다.
데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데, 이 테이블에 서비스에서 필요한 정보를 다 저장하고 활용하게 된다. 엑셀의 세로의 열 부분이Column이고, 가로의 행 부분이 엔티티 객체가 된다. 이 테이블 전체가엔티티이고, 각 1개의 행들이엔티티 객체가 되는 것이라고 생각하면 된다.