Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Linux
- Java
- map
- 리눅스
- Memoir
- 명령어
- 카카오
- java 백준 1차원 배열
- 반복문
- 자바
- Kotlin
- GoingBus
- 스프링 빈
- JavaScript
- 프로그래머스
- 코테
- 스프링 컨테이너
- 연습문제
- 리눅스마스터1급
- 백준 javascript
- 월간코드챌린지
- toCharArray
- 자바스크립트 코딩의 기술
- 리눅스마스터 1급 정리
- 코딩테스트
- 리눅스마스터 3과목
- 문자열
- 개발자 회고록
- 고잉버스
- 백준 java
Archives
- Today
- Total
hoon DevLog
Spring gradle project 스프링 핵심 원리 기본편 | 객체 지향 설계와 스프링 1 본문
반응형

본 포스팅은 인프런에 있는 인터넷 강좌인,
김영한 강사님의 스프링 핵심 원리 기본편을 공부하며,
개인적으로 공부하고, 정리하는 용도로 포스팅을 해보겠다.
1. 객체 지향 설계와 스프링
1-1. Spring이란?
- Java의 웹 프레임워크로 Java 언어를 기반으로 사용한다.
- Java로 다양한 애플리케이션을 만들기 위한 프로그래밍 틀이라 할 수 있다.
- JAVA의 활용도가 높아지면서, Java를 이용한 기술이 JSP, Mybatis, JPA 등의 기술이 생겨났고, 다른 사람의 코드를 참조하기 쉽고 편리한 구조로 앞서 말한 기술들을 더 쉽게 사용해 주는 오픈소스 프레임워크(Open Source Framework)다.
SpringBoot란
- 기본적으로 Spring을 편리하게 사용할 수 있도록 지원한다.
- 단독으로 실행할 수 있는 Spring Application을 쉽게 생성하고, Tomcat과 같은 웹 서버를 내장해서 별도 웹 서버를 설치하지 않아도 된다.
- 손쉬운 빌드 구성을 위한 starter 종속성을 제공하고, Springboot를 통해 Spring Framework의 기술들을 편리하게 사용한다.
Spring 핵심
- 웹 어플리케이션을 만들고, DB접근이 편리한 기술이다.
- Java 기반, 즉 Java의 가장 큰 특징인 객체 지향 프로그래밍을 지향한다.
- 따라서 Spring은 좋은 객체 애플리케이션을 개발할 수 있도록 도와준다.
1-2. 좋은 객체지향 프로그래밍이란?
- 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하는 것이다.
- 각각의 객체는 메시지 를 주고받고, 데이터를 처리할 수 있다.
- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
다형성의 비유
- 다형성이란 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것으로, 역할과 구현으로 비유를 할 수 있겠다.
- 역할은 interface, 구현은 interface를 구현한 클래스, 즉 구현 객체(implementation)
- 예를 들어, 자동차가 현대, 기아, 벤츠 등으로 바뀌어도, 운전자는 운전만 할 수 있으면 운전 가능하다!
- 즉 자동차의 브랜드나 종류가 바뀔 뿐, 운전하면 움직이는 기능은 같고, 각 차종별로 다른 기능이 탑재될 수 있다.
- 자동차의 역할을 interface, 그리고 그것을 상속받는 실제 자동차(현대, 기아, 벤츠 등)를 implementation 이라고 생각하면 편할 거 같다.
- 항상 구체적인 구현보다, 역할인 interface가 먼저 설계돼야 한다!!
- 객체 설계 시 interface를 먼저 부여되고, 그 역할을 수행하는 구현 객체를 만듦으로써, 해당 interface의 기능을 완벽하게 구현한다.

- 위 그림과 같이 MemberRepository를 save와 같이, 같은 이름의 메서드지만, 기능이나 로직이 다른 메서드일 수 있다.
- 이때, 클라이언트 요청에 따라 손쉽게 변경할 수 있는 것, 이것이 다형성의 특장점이라 할 수 있겠다.
- 그리고 다형성의 특장점을 가장 잘 나타내는 것이 메서드 오버로딩과 오버라이딩이 되겠다.
오버로딩(Overloading) / 오버라이딩(Overriding)
- 이 둘의 공통점은 클래스의 인스턴스 멤버인 메서드의 명은 같지만, 메서드를 재정의 또는 확장의 개념의 차이이다.
- 오버로딩(Overloading) : 부모 클래스의 상속을 받은 자식 클래스에서 확장하는 개념
- 오버로딩은 메서드의 이름이 일치하지만, 매개변수의 개수 또는 타입이 달라야 하며, 메소드의 return 타입이 달라야 한다.
class Car {
int modelNum;
String model;
public int setModel(int modelNum) {
this.modelNum = modelNum;
return this.modelNum;
}
public String setModel(int modelNum, String brand) {
this.model = brand + modelNum;
return this.model;
}
}
public class CarOverloadingTest {
public static void main(String[] args) {
Car car = new Car();
car.setModel(1234); // 1234
car.setModel(4885, "avante"); // avante4885
}
}
- Car 클래스에서 setModel이라는 같은 이름으로 메서드를 선언했지만, 각각의 메서드는 int를 리턴할 것이냐, String을 리턴하는 차이와, 매개변수를 1개만 받을 것이냐, 2개만 받을 것이냐의 차이도 존재한다.
- 다음은 오버라이딩이다.
- 오버라이딩(Overriding) : 하나의 클래스 내부에서 확장하는 개념
- 메서드의 이름이 일치하면서, 메소드 매개변수의 개수, 순서 그리고 데이터 타입 일치 해야 하고, return 타입이 일치해야 함
class Car {
int speed = 0;
public int setSpeed(int speed_change) {
this.speed += speed_change;
return this.speed;
}
}
class Avante extends Car {
final int MAX_SPEED = 150;
public int setSpeed(int speed) {
this.speed += speed;
if (this.speed > MAX_SPEED) {
this.speed = MAX_SPEED;
}
return this.speed;
}
}
public class CarOverridingTest {
public static void main(String[] args) {
Car car = new Car();
car.setSpeed(30);
Avante avante = new Avante();
avante.setSpeed(180);
}
}
- Avante 클래스는 Car 클래스를 상속받아, MAX_SPEED 라는 상수로 재정의를 하고, int를 return 하면서 매개변수로 int형 변수를 받는 setSpeed 메서드를 받음과 동시에 메서드에 if 조건이 추가되며 사용하고 있다.
- 오버라이딩을 하게 되면, Car 클래스를 상속받아도, setSpeed를 내가 원하는 대로 로직을 바꿔 사용할 수 있다.
- 이렇게 오버로딩과, 오버라이딩을 통해 다형성을 이용한 객체 지향 코딩을 한다고 할 수 있다.
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체사이의 관계에서 시작해야 함
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
Spring과 객체 지향
- 다형성이 가장 중요하다!
- Spring은 다형성을 극대화해서 이용할 수 있게 도와준다.
- 스프링에서 이야기하는 제어의 역전(0C), 의존관계 주입(DI)은 다형성을 활용해서, 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
728x90
반응형
'IT > Spring' 카테고리의 다른 글
Spring gradle project 스프링 핵심 원리 기본편 | 객체 지향 원리 적용 (15) | 2024.03.29 |
---|---|
Spring gradle project 스프링 핵심 원리 기본편 | 주문 할인 도메인 설계 (2) | 2024.03.28 |
Spring gradle project 환경설정 및 회원 가입 서비스 예제 만들기 (12) | 2024.03.21 |
Spring gradle project 스프링 핵심 원리 기본편 | 객체 지향 설계와 스프링 2 (4) | 2024.03.14 |
Spring Interceptor 개념 및 동작원리 (0) | 2023.06.27 |