군만두의 IT 개발 일지

[Java] OOP부터 Spring Boot까지 본문

개발일지/패스트캠퍼스

[Java] OOP부터 Spring Boot까지

mandus 2024. 2. 21. 15:30

목차

    ⭐ 요약


    • 패스트캠퍼스 백엔드 개발 부트캠프 과정에서 자바 기초를 학습한다.
    • 변수, 자료형, 제어문 등 기본 문법부터 시작하여 객체지향 프로그래밍(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 설계 원리와 그대로 연결된다는 점이 인상적이었다. 기초를 탄탄히 쌓는 것이 왜 중요한지 다시 한번 느꼈다.
    • 앞으로 컬렉션, 스트림, 람다를 코드에 자연스럽게 쓸 수 있도록 연습할 예정이다.

     

    이 글은 패스트캠퍼스백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.
    Comments