GO SOPT 서버파트 1차 세미나(자바의 객체지향 및 서버의 이해)를 들으면서 과제로 나온 것 외에 스스로 부족하다고 느낀 개념들이 생겨 정리해보았습니다 :)
혹시 읽어보시면서 잘못된 개념이 있으면 피드백 부탁드립니다!!
1️⃣ 클래스(class): 객체를 정의하고 만들어내기 위한 설계도 혹은 틀, 변수와 메서드들이 존재
2️⃣ 객체(object): 클래스에 선언된 모양 그대로 생성된 실체, '클래스의 인스턴스'
3️⃣ 인스턴스(instance): 클래스를 통해서 구현해야할 대상(객체)이 실제로 구현된 구체적인 실체
❗️객체↔️인스턴스: 객체는 소프트웨어 세계에 구현할 대상(concept), 인스턴스는 소프트웨어 세계에 구현된 실체
1️⃣ 스택: 정적 메모리 할당, 함수의 호출과 관계되는 지역변수와 매개변수 저장
👍 할당과 해제가 빠름, 변수를 명시적으로 할당 해제 할 필요가 없음
👎 메모리 크기 제한, 지역변수만
2️⃣ 힙: 동적 메모리 할당, 사용자가 직접 관리할 수 있는 '관리 해야만 하는' 메모리 영역, 사용자에 의해 메모리 공간이 동적으로 할당되고 해제
👍 메모리 크기에 제한이 없으며, 변수를 전역적으로 액세스 할 수 있음
👎 할당과 해제가 느리며, 메모리를 관리해야하는 책임이 있음
캡슐화를 하는 이유
1️⃣ 데이터 보호(Data protection) - 외부로부터 클래스에 정의된 속성과 기능들을 보호
2️⃣ 데이터 은닉(Data hiding) - 내부의 동작을 감추고 외부에는 필요한 부분만 노출
❗️보호↔️은닉: 데이터 보호는 수정과 관련이 깊으며, 데이터 은닉은 조회와 관련이 깊다고 이해함
👉 Object 클래스의 clone() 메소드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 함
👉 단순히 인스턴스 변수의 값만 복사하기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않음 [얕은 복사]
👉 자세한 사용법 참고: https://velog.io/@roro/Java-Object-클래스-clone
❗️다형성을 통해 구체적인 클래스가 아닌 인터페이스 또는 추상 클래스를 사용할 수 있기 때문에 의존성이 줄어들게 됨
인터페이스에 상수를 정의해본 경험이 없어서 의아함을 느꼈는데,
인터페이스는 변수를 등록할 때 자동으로 public static final 키워드가 붙기 때문에 상수처럼 어디에서나 접근할 수 있다는 특징이 있음
따라서 사용할 때 몇가지 장점이 있으나, 문제점이 많다보니 anti-pattern임
👉 장점 및 anti-pattern인 이유: https://dev-coco.tistory.com/179
1️⃣ 추상클래스는 변수 상속을 가질 수 있음, 즉 구체적인 하위 클래스에서 상속되는 인스턴스 변수를 정의할 수 있음 (액세스하고 수정 가능)
2️⃣ 인터페이스는 암시적으로 공개적이고 정적이며 최종적인 추상 메서드와 상수만 정의함, 인스턴스 변수를 정의할 수 없으므로 변수 상속이 없음
👉 Java EE (Enterprise Edition): 웹 프로그래밍에 필요한 기능(JSP, Servlet, JDBC 등)을 다수 포함 하며 대규모, 다계층, 확장성, 신뢰성, 보안 네트워킹 API, 환경 등을 제공하는 자바 프로그래밍 언어 플랫폼
👉 자바 프로그래밍 언어 플랫폼은 JVM과 API로 구성되어 있으며, 타겟 플랫폼상에서 동작되도록 작성된 어플리케이션들이 자바 프로그래밍 언어의 장점 (플랫폼에 비종속적, 안정성, 개발 용이 등)을 그대로 갖출 수 있게 함
👉 오픈소스: 소스 코드와 함께 제공되어 누구나 보고, 수정하고, 배포할 수 있도록 하는 소프트웨어를 의미
👉 경량급: 기존에 스프링 대신 사용하던 기술들과 비교하여, 스프링을 사용했을 때에 개발자가 작성해야 할 코드가 상대적으로 단순하다는 의미
👉 애플리케이션 프레임워크:애플리케이션을 개발하는 데에 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공
1️⃣ 생성자 주입; Constructor Injection
👉 final 키워드 선언 가능, 테스트 코드 작성 용이
@Controller
public class HomeController {
private final GameService gameService;
// Spring 4.3 이전 버전이라면 @Autowired 필요
public HomeController(GameService gameService) {
this.gameService = gameService;
}
}
2️⃣ 필드 주입; Field Injection
👉 final 키워드 선언 불가능, 코드 양이 줄어듦, 의존 관계 파악하기 힘듦
@Controller
public class HomeController {
@Autowired
private GameService gameService;
}
3️⃣ 수정자 주입; Setter Injection
👉 final 키워드 선언 불가능, setter 메서드에 @Autowired를 붙임
@Controller
public class HomeController {
private GameService gameService;
@Autowired
public setService(GameService gameService) {
this.gameService = gameService;
}
}
❗️생성자 주입을 권하는 이유: https://mangkyu.tistory.com/125
1️⃣ 라이브러리 관리 자동화
👉 Spring Boot의 Starter 라이브러리를 틍록해서 라이브러리의 의존성을 간단하게 괸리할 수 있음
2️⃣ 라이브러리 버전 자동 관리
👉 기존에는 Spring 라이브러리의 버전을 하나하나 입력해야 했지만, Spring Boot 버전을 입력하면 Spring 라이브러리 뿐만 아니라 서드 파티 라이브러리들도 호환되는 버전으로 알아서 다운 받아줌
3️⃣ 설정 자동화
👉 @EnableAutoConfiguration → Spring에서 자주 사용했던 설정을 알아서 등록해줌
4️⃣ 내장 Tomcat (WAS)
👉 Spring Boot는 Tomcat을 내장하고 있기 때문에 @SpringBootApplication 어노테이션이 선언되어 있는 클래스의 main() 메소드를 실행하는 것만으로 서버를 구동시킬 수 있음, 내장 Tomcat을 사용하려면 특별한 설정 없이 Web Starter 의존성만 추가해주면 됨
5️⃣ 독립적으로 실행 가능한 JAR
👉 웹 프로젝트라면 WAR 파일로 패키징해야하지만 Spring Boot는 내장 Tomcat을 지원하기 때문에 JAR 파일로 패키징해서 웹 어플리케이션을 실행시킬 수 있음 (Java가 설치된 모든 시스템에서 실행할 수 있게 됨)
1️⃣ Gradle 🆚 Maven
👉 둘다 종속성을 관리하고, 코드를 컴파일하고, 애플리케이션을 배포 가능하게 패키징 하기 위해 Java에서 일반적으로 사용되는 빌드 자동화 도구임
👉 빌드 구성 언어에도 차이가 있으며 (Gradle 안에서도 Groovy와 Kotlin으로 나뉨), 종속성 관리에 대한 접근 방식, 성능에서도 차이점이 존재함
2️⃣ Spring Boot 버전
👉 SNAPSHOT: 아직 개발이 완료되지 않은 버전을 의미
👉 M(Milestone): 개발은 완료되었으나, 아직 기능들을 개선하는 중 또는 버그를 수정하고 있는 버전을 의미합니다.
👉 RC(Release Candidate): 기능 개선과 버그 수정이 완료되었으나, 최종적으로 릴리즈되지는 않은 버전을 의미합니다.
3️⃣ Project Metadata
👉 Group: 프로젝트를 만드는 그룹의 이름으로, 보통 기업의 도메인 명을 역순으로 입력
👉 Artifact: 빌드 결과물의 이름
👉 Name: 프로젝트의 이름
👉 Description: 프로젝트에 대한 간략한 설명
👉 Package name: 프로젝트에 생성할 패키지를 설정
👉 Packaging: 배포를 위해 프로젝트를 압축하는 방법을 선택
👉 Java: PC에 설치된 JDK의 버전을 선택