| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 | 30 |
- 티스토리챌린지
- Java
- 오블완
- KDT
- 부트캠프
- 오픈챌린지
- 백엔드개발자
- baekjoon
- UXUIPrimary
- API
- 국비지원취업
- 오픈패스
- OPENPATH
- Spring
- 시스템설계
- 디자인강의
- 환급챌린지
- 국비지원교육
- 국비지원
- 내일배움카드
- 백엔드 부트캠프
- 디자인챌린지
- UXUI기초정복
- JPA
- Be
- 백준
- 디자인교육
- 패스트캠퍼스
- mysql
- UXUI챌린지
- Today
- Total
군만두의 IT 개발 일지
[Java] OOP부터 Spring Boot까지 본문
목차
⭐ 요약
- 패스트캠퍼스 백엔드 개발 부트캠프 과정에서 자바 기초를 학습한다.
- 변수, 자료형, 제어문 등 기본 문법부터 시작하여 객체지향 프로그래밍(OOP), 컬렉션, 제네릭, 람다, 스트림까지 단계적으로 학습한다.
- 학습한 자바 지식을 바탕으로 Spring Boot REST API 프로젝트에도 적용한다.
⭐ 학습 내용
1. 자바 기본 문법
자바의 가장 기초가 되는 문법들을 학습한다. 변수 선언과 초기화, 기본 자료형(int, float, char, boolean 등), 형변환(Casting), 연산자(산술, 비교, 논리, 삼항), 조건문(if-else, switch-case), 반복문(for, while, do-while) 순서로 진행한다.
아래는 대표적인 형변환 예시 코드이다.
float x = 15.6f;
int y = (int) x; // 강제 형변환 → 소수점 손실 발생
System.out.println("y = " + y); // 15
char c = 'A';
int cc = c; // 자동 형변환 → 65 출력
System.out.println("cc = " + cc);
2. 배열(Array)
동일한 타입의 데이터를 한 번에 관리하기 위해 배열을 사용한다. 1차원 배열부터 2차원 배열, 객체 배열(Object Array)까지 학습한다. 배열은 크기가 고정된다는 단점이 있어, 이후 컬렉션 프레임워크의 필요성을 자연스럽게 이해하게 된다.
// 1차원 배열 초기화
int[] a = {10, 20, 30, 40, 50};
// 2차원 배열 생성
int[][] b = new int[2][4];
// 객체 배열 (Book 3권)
Book[] books = new Book[3];
books[0] = new Book();
books[0].title = "자바";
3. 메서드(Method)와 오버로딩(Overloading)
메서드는 반복되는 코드를 재사용하기 위한 핵심 개념이다. 정적 메서드(static)와 인스턴스 메서드의 차이를 이해하고, 메서드 오버로딩(Overloading)을 통해 매개변수 타입이 다른 동일한 이름의 메서드를 정의할 수 있다는 것을 학습한다.
// 오버로딩 예시: 매개변수 타입이 다른 add() 메서드 2개
public static int add(int a, int b) {
return a + b;
}
public static float add(float a, float b) {
return a + b;
}
4. 객체지향 프로그래밍(OOP)
자바의 핵심인 객체지향 4대 원칙(캡슐화, 상속, 다형성, 추상화)을 학습한다. 클래스 설계에서 시작하여 VO/DTO 패턴, 접근 제어자(public, private), 생성자 오버로딩, getter/setter를 순서대로 익힌다.
특히 업캐스팅(Upcasting)과 동적 바인딩(Dynamic Binding)의 조합으로 다형성이 실현되는 원리가 핵심이다. 아래 표는 주요 개념을 정리한 것이다.
| 개념 | 설명 | 키워드 |
| 캡슐화 | 멤버 변수를 private으로 숨기고 getter/setter로 접근을 제어함 | private, getter, setter |
| 상속 | 부모 클래스의 속성과 메서드를 자식 클래스가 물려받음 | extends, super() |
| 다형성 | 업캐스팅 후 동적 바인딩으로 자식 메서드가 호출됨 | Upcasting, Override |
| 추상화 | 추상 클래스·인터페이스로 구현을 강제함 | abstract, interface |
// 업캐스팅 + 동적 바인딩 예시
Animal ani = new Dog();
ani.eat(); // Dog의 eat()가 실행된다 → 동적 바인딩
ani = new Cat();
ani.eat(); // Cat의 eat()가 실행된다
// 다운캐스팅으로 자식 전용 메서드 호출
((Cat) ani).night();
5. 추상 클래스와 인터페이스
다형성을 강제하기 위해 추상 클래스(abstract class)와 인터페이스(interface)를 사용한다. 추상 클래스는 추상 메서드와 구현 메서드를 함께 가질 수 있고, 인터페이스는 모든 메서드가 추상 메서드이다(Java 8 이전 기준).
인터페이스 기반 프로그래밍의 대표적인 예시로, DB 드라이버(OracleDriver, MySQLDriver, MSSQLDriver)를 동일한 Connection 인터페이스로 교체 가능하게 설계하는 패턴을 학습한다.
// 인터페이스 기반 DB 연결 예시
Connection conn = new OracleDriver();
conn.getConnection("jdbc:oracle:...", "system", "manager");
// 드라이버를 MySQL로 교체해도 동일한 코드 사용 가능
conn = new MySQLDriver();
conn.getConnection("jdbc:mysql://...", "root", "12345");
6. 컬렉션 프레임워크, 제네릭, 람다, 스트림
배열의 고정 길이 문제를 해결하기 위해 ArrayList, HashMap, HashSet 등 컬렉션 프레임워크를 학습한다. 제네릭(Generic)으로 타입 안전성을 보장하고, 람다식(Lambda)과 스트림(Stream)으로 코드를 간결하게 작성하는 방법을 익힌다.
// 스트림 + 람다 예시: 짝수의 합 구하기
int[] numbers = {1, 2, 3, 4, 5};
int sumOfEvens = Arrays.stream(numbers)
.filter(n -> n % 2 == 0)
.sum();
System.out.println("sumOfEvens = " + sumOfEvens); // 6
// 함수형 인터페이스 + 람다
MathOperation add = (x, y) -> x + y;
System.out.println(add.operation(10, 20)); // 30
7. Spring Boot 기초 적용
학습한 자바 지식을 바탕으로 Spring Boot 프로젝트를 진행한다. REST API 설계, 예외 처리(GlobalExceptionHandler), 입력값 검증(Validation), JPA를 활용한 DB 연동, 메모리 DB에서 실제 MySQL로의 마이그레이션까지 단계적으로 구현한다.
| 챕터 | 주요 내용 |
| REST API | @GetMapping, @PostMapping, @PathVariable, @RequestBody, Snake Case 전략 |
| Exception | @RestControllerAdvice, @ExceptionHandler, 전역 예외 처리 |
| Validation | @Valid, @NotBlank, @Size, 커스텀 어노테이션(PhoneNumber, YearMonth) |
| JPA | @Entity, JpaRepository, 쿼리 메서드, @Query(nativeQuery) |
| SimpleBoard | 게시판 CRUD, @OneToMany, @ManyToOne, 페이지네이션(Pageable) |
⭐ 어려웠던 점
- 업캐스팅과 동적 바인딩의 관계가 처음에는 헷갈렸다. 부모 타입으로 자식 객체를 가리킬 때 실행 시점에 자식 메서드가 호출된다는 개념을 코드로 직접 확인하면서 이해하게 되었다.
- 인터페이스와 추상 클래스의 사용 시점을 구분하는 것이 어려웠다. 인터페이스는 다형성 100% 보장이 목적이고, 추상 클래스는 공통 구현 로직을 공유하면서도 재정의를 강제할 때 유용하다는 차이를 학습했다.
- Spring Boot에서 JPA 연관관계(@OneToMany, @ManyToOne)를 설계할 때 양방향 매핑으로 인한 무한 순환 참조 문제가 발생했다.
@JsonIgnore와@ToString.Exclude로 해결할 수 있었다.
⭐ 후기
- 단순히 문법을 외우는 것에서 벗어나, 왜 객체지향이 필요한지를 코드로 체감할 수 있었다.
- 자바 기초에서 배운 인터페이스 개념이 Spring Boot의 JpaRepository 설계 원리와 그대로 연결된다는 점이 인상적이었다. 기초를 탄탄히 쌓는 것이 왜 중요한지 다시 한번 느꼈다.
- 앞으로 컬렉션, 스트림, 람다를 코드에 자연스럽게 쓸 수 있도록 연습할 예정이다.
이 글은 패스트캠퍼스의 백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.
'개발일지 > 패스트캠퍼스' 카테고리의 다른 글
| 패스트캠퍼스 백엔드 개발 부트캠프 8기 그룹스터디 시작 - 면접 대비 CS 지식 학습 (0) | 2024.02.26 |
|---|---|
| [후기] 패스트캠퍼스 백엔드 개발 부트캠프 8기 부트캠프 활용법 특강 (0) | 2024.02.23 |
| [후기] 패스트캠퍼스 백엔드 개발 부트캠프 8기 1회차 멘토링 (0) | 2024.02.21 |
| [Java] 자바 기초 다지기(JVM과 자바의 구동방식) (1) | 2024.02.17 |
| [데이터베이스] 데이터베이스 기본 개념 (1) | 2024.02.14 |