backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 블록(Block)과 스코프(Scope)
  • 블록(Block)
  • 블록의 종류
  • 스코프(Scope)
  • 스코프의 종류
  • 인스턴스의 필드는 다른 영역으로 간주하여 변수 선언 가능
  • 패키지
  • import
  • 1. 기본 import 문법
  • 1. Car 클래스
  • 2. Main 클래스
  • 실행 흐름
  • 패키지와 접근 제어자의 실용적인 사용
  • 메인 메소드
  • main 메소드의 역할
  • 기본 main 메소드
  • 실행 흐름
  • 열거형(enum)
  • enum의 기본 문법
  • enum 사용
  • switch 문에서의 enum 사용
  • enum 활용
  • enum 활용 예제
  1. 자바

08 클래스 더 알아보기

블록(Block)과 스코프(Scope)

변수의 유효 범위를 결정하는 개념으로, 자바에서 코드의 구조와 가독성뿐만 아니라 메모리 관리에도 영향을 미칩니다. 자바에서 변수는 선언된 블록 내에서만 유효하며, 이를 스코프라고 합니다.

블록(Block)

블록은 중괄호 {}로 둘러싸인 코드 영역을 의미합니다. 자바에서 블록은 여러 곳에서 사용되며, 일반적으로 조건문, 반복문, 메소드 등을 정의할 때 블록을 사용합니다. 블록은 코드의 실행 흐름을 제한하는 역할을 합니다.

블록의 종류

  1. 메소드 블록: 메소드 내에서 실행되는 코드 영역입니다.

  2. 조건문 블록: if, else, switch 등의 조건문 내에서 사용되는 블록입니다.

  3. 반복문 블록: for, while, do-while 등의 반복문에서 사용되는 블록입니다.

  4. 익명 블록: 메소드나 클래스 외부에서 사용되며, 별도의 문법 없이 {}로만 감싸서 특정 코드를 묶는 블록입니다.

blockExample 패키지

public class Main {
    public static void main(String[] args) {
        // 외부 블록에 선언된 변수
        int x = 10;
        System.out.println("외부 블록 x: " + x);  // 출력: 외부 블록 x: 10

        // 내부 익명 블록 시작
        {
            // 동일한 이름의 변수 선언 불가능. 에러 발생
            // int x = 20;
            System.out.println("내부 블록 x: " + x); // 내부 블록의 변수 제거하면 작동
        }
    }
}

스코프(Scope)

스코프는 변수나 메소드가 유효한 범위를 의미합니다. 자바에서는 변수가 선언된 블록 내에서만 접근 가능하며, 해당 블록을 벗어나면 더 이상 그 변수에 접근할 수 없습니다.

스코프의 종류

  1. 메소드 스코프: 메소드 내에서 선언된 변수는 해당 메소드 내에서만 접근할 수 있습니다. 메소드가 종료되면 해당 변수는 메모리에서 사라집니다.

  2. 클래스 스코프(필드 스코프): 클래스 내에서 선언된 변수(필드)는 클래스의 모든 메소드에서 접근 가능합니다. 이는 인스턴스 변수와 정적 변수로 나뉩니다.

    • 인스턴스 변수는 객체가 생성될 때마다 새롭게 생성되고, 해당 객체 내에서 유효합니다.

    • 정적 변수는 클래스 단위로 하나만 존재하며, 모든 인스턴스에서 공유됩니다.

  3. 블록 스코프: 블록 내에서 선언된 변수는 해당 블록 내에서만 유효하며, 블록이 끝나면 변수가 소멸합니다.

  4. 매개변수 스코프: 메소드의 매개변수로 전달된 변수는 해당 메소드 내에서만 유효합니다.

인스턴스의 필드는 다른 영역으로 간주하여 변수 선언 가능

instanceField 패키지

public class Car {
    // 인스턴스 변수 (클래스 필드)
    String color = "빨간색";

    // 메소드
    String repaint() {
        // 로컬 변수 (메소드 내에서 새롭게 정의된 color 변수)
        String color = "파란색";

        System.out.println("새로운 색상으로 덧칠하기 전: "
                + this.color);  // 인스턴스 변수 color

        // 인스턴스 변수 값을 로컬 변수의 값으로 변경
        this.color = color;

        return this.color;
    }

    public static void main(String[] args) {
        Car myCar = new Car();  // Car 객체 생성
        System.out.println("새로운 색상으로 덧칠한 후: "
                + myCar.repaint());  // 변경된 인스턴스 변수 color
    }
}

패키지

패키지(Package)는 관련된 클래스와 인터페이스들을 그룹화하여 조직화된 코드 구조를 제공하는 자바의 기능입니다. 자바에서 패키지는 클래스들을 논리적인 단위로 묶어 관리하며, 코드의 재사용성과 유지보수성을 높입니다.

  • 자바 프로젝트의 디렉토리(폴더) - 패키지로 불리게 됨

    • 일정 규모 이상의 프로그램을 적절히 모듈화

    • 패키지 정보: 클래스의 구성요소 중 하나

  • 클래스명의 중복을 피하기 위해 사용

    • 같은 클래스명을 가져도 패키지가 다름

import

import는 자바에서 다른 패키지에 속한 클래스나 인터페이스를 현재 클래스에서 사용할 수 있도록 해주는 키워드입니다. import 문을 사용하여 다른 패키지에 속한 클래스를 불러오면, 해당 클래스나 인터페이스를 직접적으로 접근하고 사용할 수 있게 됩니다. 이로써 패키지 내부의 클래스를 명시적인 경로 없이도 간편하게 사용할 수 있습니다.

1. 기본 import 문법

import 패키지이름.클래스이름;
  • 패키지이름: 사용하려는 클래스가 속한 패키지의 이름입니다.

  • 클래스이름: 해당 패키지 내에서 사용할 클래스의 이름입니다.

또한 import 패키지이름.*;를 사용하면 해당 패키지 내의 모든 클래스를 불러올 수 있습니다.(와일드카드)

import 패키지이름.*;

1. Car 클래스

vehicles 패키지

package edu.ch8.vehicles;

public class Car {
    public String model = "Sonata";

    public void printModel() {
        System.out.println("차량 모델: " + model);
    }
}

2. Main 클래스

importVehicles 패키지 (vehicles 패키지랑 다른 위치)

// 다른 패키지의 클래스를 사용하기 위해 import
package edu.ch8.importVehicles;

import edu.ch8.vehicles.Car;

public class Main {
    public static void main(String[] args) {
        // Car 클래스 사용 (import 통해 접근)
        Car myCar = new Car();
        myCar.printModel();  // 출력: 차량 모델: Sonata
    }
}

실행 흐름

  1. Main 클래스는 vehicles 패키지의 Car 클래스를 사용하려고 합니다.

  2. vehicles 패키지는 Main 클래스와 다른 패키지에 속해 있으므로, import vehicles.Car; 구문을 사용해 Car 클래스를 가져옵니다.

  3. 이제 Car 클래스를 직접적으로 사용할 수 있습니다.

패키지와 접근 제어자의 실용적인 사용

public과 패키지

  • 클래스나 메소드를 외부에서 접근 가능하게 하려면 public으로 선언하여 모든 패키지에서 접근할 수 있도록 해야 합니다.

protected와 패키지

  • 패키지 내부 또는 상속받은 클래스에서만 사용해야 할 때 protected를 사용합니다. 이를 통해 외부 패키지에서는 접근을 제한하면서도 상속 관계에서는 확장할 수 있습니다.

default와 패키지

  • 패키지 전용 기능을 만들 때 유용합니다. 패키지 외부에서는 접근할 수 없기 때문에, 패키지 내부의 코드만 접근 가능한 유틸리티 클래스나 메소드를 만들 때 사용됩니다.

private와 패키지

  • 클래스 내부에서만 사용할 필드나 메소드는 private으로 선언하여, 다른 클래스나 패키지에서 접근할 수 없게 해야 합니다.

접근 제어자

같은 클래스

같은 패키지

상속받은 자식 클래스

다른 패키지

public

O

O

O

O

protected

O

O

O

X

default

O

O

X

X

private

O

X

X

X

접근 제어자가 패키지와의 관계에서 어떻게 동작하는지를 보여줍니다.

메인 메소드

main 메소드의 역할

  • 자바 애플리케이션의 시작점으로, JVM이 프로그램 실행 시 가장 먼저 호출하는 메소드입니다.

  • 프로그램이 시작되면 필요한 초기화 작업을 수행하고, 이후 다른 메소드나 객체를 생성하여 프로그램 로직을 수행합니다.

기본 main 메소드

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
}

실행 흐름

  1. 자바 가상 머신(JVM)은 자바 애플리케이션을 실행할 때, 클래스 내의 main 메소드를 호출합니다.

  2. 위의 코드에서, main 메소드는 "Hello, Java!"를 출력하는 역할을 합니다.

  3. 프로그램이 끝나면 main 메소드도 종료되며, 프로그램이 종료됩니다.

열거형(enum)

열거형(enum)은 자바에서 상수들의 집합을 정의할 때 사용하는 특별한 데이터 타입입니다. 즉, 정해진 상수들의 이름을 가진 집합을 만들고, 그 상수들만 사용할 수 있도록 하는 기능을 제공합니다. enum을 사용하면 가독성을 높이고, 값의 범위를 제한하여 코드의 안정성과 유지보수성을 향상시킬 수 있습니다.

enum의 기본 문법

enum은 자바에서 클래스와 비슷하게 동작하지만, 상수들을 정의하는 데 특화된 타입입니다.

package edu.ch8.sectionEnum;

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

enum 사용

package edu.ch8.sectionEnum;

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.WEDNESDAY;

        if (today == Day.WEDNESDAY) {
            System.out.println("오늘은 수요일입니다.");
        }

        // Enum 값을 출력
        System.out.println(today);  // 출력: WEDNESDAY
    }
}

switch 문에서의 enum 사용

package edu.ch8.sectionEnum;

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.FRIDAY;

        // switch 문에서 enum 사용
        switch (today) {
            case MONDAY:
                System.out.println("오늘은 월요일입니다.");
                break;
            case FRIDAY:
                System.out.println("오늘은 금요일입니다.");
                break;
            case SUNDAY:
                System.out.println("오늘은 일요일입니다.");
                break;
            default:
                System.out.println("오늘은 평일입니다.");
                break;
        }
    }
}

enum 활용

enum은 단순한 상수 집합을 넘어서, 클래스처럼 필드, 생성자, 메소드를 가질 수 있습니다. 이를 통해 각 상수에 추가적인 속성이나 동작을 부여할 수 있습니다.

  1. 필드: 상수와 연관된 속성 값입니다.

  2. 생성자: 각 상수가 생성될 때 호출되며, 필드를 초기화합니다.

  3. 메소드: 각 상수에 대한 동작을 정의합니다.

enum 활용 예제

자동차의 모델명과 가격을 속성으로 가지는 enum을 정의하고, 필드, 생성자, 메소드를 사용하는 예제입니다.

enum 작성

package edu.ch8.enumVehicles;

public enum Car {
    // 열거형 상수 (각 상수는 이름과 가격을 가짐)
    TESLA("Tesla Model S", 80000),
    BMW("BMW i8", 140000),
    AUDI("Audi R8", 170000);

    // 필드: 자동차의 모델명과 가격
    private final String modelName;
    private final int price;

    // 생성자: 열거형 상수에 대한 필드를 초기화
    Car(String modelName, int price) {
        this.modelName = modelName;
        this.price = price;
    }

    // getter 메소드: 모델명 반환
    public String getModelName() {
        return modelName;
    }

    // getter 메소드: 가격 반환
    public int getPrice() {
        return price;
    }

    // 메소드: 자동차 정보 출력
    public void printInfo() {
        System.out.println(this.name() + ": " + modelName + ", 가격: $" + price);
    }
}

enum 사용

// 다른 패키지의 enum 사용하기 위해서 import
package edu.ch8.importEnumVehicles;

import edu.ch8.enumVehicles.Car;

public class Main {
    public static void main(String[] args) {
        // 모든 열거형 상수의 정보 출력
        for (Car car : Car.values()) {
            car.printInfo();
        }

        // 특정 자동차의 정보 가져오기
        Car selectedCar = Car.TESLA;
        System.out.println("선택한 자동차: " + selectedCar.getModelName()
                + ", 가격: $" + selectedCar.getPrice());
                
        // 상수 이름으로 객체 반환
        Car car = Car.valueOf("BMW");
        car.printInfo(); // 출력: BMW: BMW i8, 가격: $140000
    }
}

위에 선언된 enum Car는 컴파일 시에 다음과 같은 구조의 클래스로 변환됨

public final class Car extends Enum<Car> {
    public static final Car TESLA = new Car("Tesla Model S", 80000);
    public static final Car BMW = new Car("BMW i8", 140000);
    public static final Car AUDI = new Car("Audi R8", 170000);

    private final String modelName;
    private final int price;

    private Car(String modelName, int price) {
        this.modelName = modelName;
        this.price = price;
    }

    public String getModelName() {
        return modelName;
    }

    public int getPrice() {
        return price;
    }

    public void printInfo() {
        System.out.println(this.name() + ": " + modelName + ", 가격: $" + price);
    }

    public static Car[] values() { //열거형의 모든 상수를 배열로 반환함
        return new Car[]{TESLA, BMW, AUDI};
    }

    public static Car valueOf(String name) {
        // 상수 이름으로 Car 객체 반환
    }
}
Previous07 객체지향 프로그래밍Next열거형 ENUM 보충자료

Last updated 5 months ago