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
  • 클래스와 인스턴스
  • 1. 클래스(Class)
  • 클래스의 구성 요소
  • 클래스 정의 예시
  • 2. 인스턴스(Instance)
  • 인스턴스 생성 방법
  • 인스턴스 사용 예시
  • 클래스와 인스턴스의 차이
  • 예시를 통한 설명
  • 정리
  • 생성자(Constructor)
  • 생성자의 기본 개념
  • 생성자 생성 단축키
  • 기본 생성자 (Default Constructor)
  • 매개변수와 this
  • 생성자 오버로딩
  • 예시: 생성자 오버로딩
  • 생성자의 역할
  • 정리
  • 클래스의 정적 필드와 정적 메소드
  • 클래스의 정적 필드(static field)
  • 정적 필드의 특징
  • 정적 필드 선언 예시
  • 정적 필드 사용 예시
  • 정적 필드와 인스턴스 필드 비교
  • 클래스의 정적 메소드(static method)
  • 정적 메소드의 특징
  • 정적 메소드 선언 예시
  • 정적 메소드 사용 예시
  • 정적 메소드와 인스턴스 메소드 비교
  • 언제 정적 필드와 메소드를 사용해야 할까?
  • 정리
  1. 자바

06 클래스 기초

클래스와 인스턴스

1. 클래스(Class)

클래스는 객체를 만들기 위한 틀 또는 설계도입니다. 클래스는 속성(필드)과 행동(메소드)을 정의하며, 실제 데이터를 가지지 않습니다. 클래스를 정의하고, 그 클래스를 바탕으로 여러 객체를 만들 수 있습니다.

클래스의 구성 요소

  • 필드(Field): 객체가 가지는 데이터(속성)입니다. 예를 들어, 사람 클래스를 만들면 이름, 나이가 필드가 될 수 있습니다.

  • 메소드(Method): 객체가 할 수 있는 동작(기능)입니다. 예를 들어, 사람 클래스에 걷다, 말하다 등의 메소드를 정의할 수 있습니다.

클래스 정의 예시

step1 패키지 안에 작성하세요

// 사람 클래스를 정의
public class Person {
    // 필드 (속성)
    String name;
    int age;

    // 메소드 (동작)
    public void sayHello() {
        System.out.println("안녕하세요! 제 이름은 " + name + "입니다. 나이는 " + age + "세입니다.");
    }
}

위 예시에서 Person이라는 클래스는 사람의 속성인 name과 age를 정의하고, 사람의 동작인 sayHello()라는 메소드를 정의합니다. 이 클래스는 사람 객체를 만들기 위한 설계도일 뿐, 아직 실제 데이터나 동작은 없습니다.

2. 인스턴스(Instance)

인스턴스는 클래스를 사용하여 실제로 생성된 객체입니다. 즉, 클래스를 기반으로 만들어진 실제 데이터가 포함된 실체입니다. 클래스는 추상적인 개념이지만, 인스턴스는 구체적인 데이터와 행동을 갖는 객체입니다.

인스턴스 생성 방법

클래스를 사용하여 인스턴스를 만들려면 new 키워드를 사용해야 합니다. new 키워드는 클래스의 설계도를 기반으로 메모리에 실제 객체를 생성하는 역할을 합니다.

Person person1 = new Person();  // Person 클래스의 인스턴스 person1 생성
Person person2 = new Person();  // 또 다른 인스턴스 person2 생성

인스턴스 사용 예시

// step1 패키지 안에 작성
public class Main {
    public static void main(String[] args) {
        // Person 클래스의 인스턴스 생성
        Person person1 = new Person();

        // 인스턴스의 필드 값을 설정
        person1.name = "홍길동";
        person1.age = 30;

        // 인스턴스의 메소드 호출
        person1.sayHello();  // 출력: 안녕하세요! 제 이름은 홍길동입니다. 나이는 30세입니다.
    }
}
  • person1은 Person 클래스를 기반으로 만들어진 하나의 인스턴스입니다.

  • person1.name = "홍길동";를 통해 person1 인스턴스의 name 속성에 "홍길동"을 할당하고, person1.age = 30;을 통해 나이를 설정합니다.

  • person1.sayHello()를 호출하면, 해당 인스턴스의 sayHello() 메소드가 실행됩니다.

클래스와 인스턴스의 차이

구분
클래스(Class)
인스턴스(Instance)

정의

객체를 만들기 위한 설계도 또는 청사진

클래스를 기반으로 생성된 실제 객체

역할

객체의 속성과 동작을 정의

정의된 클래스를 바탕으로 실제 데이터를 가짐

메모리

클래스 자체는 메모리를 차지하지 않음

인스턴스는 실제로 메모리에서 공간을 차지함

사용

객체를 정의하는 데 사용

실제 프로그램에서 동작하는 객체

예시를 통한 설명

  1. 클래스는 설계도: Person 클래스는 "사람"이라는 객체를 만들기 위한 틀입니다. 이 클래스만으로는 아무런 데이터나 동작을 할 수 없고, 단지 사람의 이름과 나이, 행동을 정의하는 구조만 가지고 있습니다.

  2. 인스턴스는 실체: person1과 person2는 Person 클래스를 기반으로 만들어진 실제 객체입니다. 각각의 인스턴스는 독립적인 데이터를 가지고 있습니다. 예를 들어, person1.name은 "홍길동"이고, person2.name은 "김영희"가 될 수 있습니다.

정리

  • 클래스(Class): 객체를 만들기 위한 설계도입니다. 객체가 가져야 할 속성과 행동을 정의합니다.

  • 인스턴스(Instance): 클래스를 사용하여 생성된 실제 객체입니다. 클래스는 추상적이지만, 인스턴스는 구체적인 데이터와 행동을 가집니다.

생성자(Constructor)

생성자(Constructor)는 클래스의 인스턴스를 생성할 때 호출되는 메소드로, 객체의 초기화 작업을 담당합니다. 생성자는 객체가 생성될 때 자동으로 실행되며, 객체의 필드를 초기화하거나 필요한 설정을 수행하는 데 사용됩니다. Java에서 생성자는 클래스와 같은 이름을 가지며, 리턴 타입이 없습니다.

생성자의 기본 개념

  • 클래스와 동일한 이름을 가집니다.

  • 리턴 타입이 없고, 값을 반환하지 않습니다. (심지어 void도 사용하지 않습니다.)

  • 객체가 생성될 때 자동으로 호출되며, 객체를 초기화합니다.

  • 생성자는 매개변수를 가질 수 있으며, 여러 개의 생성자를 정의하는 생성자 오버로딩도 가능합니다.

생성자 생성 단축키

인텔리제이에서 단축키 입력 후

  • 윈도우: alt + insert

  • 맥: command + N

“생성자” 또는 “Constructor” 클릭하여 생성 가능합니다.

기본 생성자 (Default Constructor)

defaultConstructor 패키지에 생성

Java에서는 기본 생성자라는 특별한 생성자가 있습니다. 기본 생성자는 매개변수가 없는 생성자로, 클래스에 명시적으로 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 제공합니다. 이 생성자는 필드 초기화를 포함한 작업을 하지 않으므로, 객체만 생성됩니다.

public class Person {
    String name;
    int age;

    // 기본 생성자
    public Person() {
        name = "Unknown";
        age = 0;
    }
}

위 예시에서 Person 클래스는 기본 생성자를 가지고 있으며, 이 생성자는 name과 age 필드를 기본 값으로 초기화합니다.

public class Main {
    public static void main(String[] args) {
        Person person1 = new Person();  // 기본 생성자가 호출됨
        System.out.println(person1.name);  // 출력: Unknown
        System.out.println(person1.age);   // 출력: 0
    }
}

매개변수와 this

  • 생성자는 매개변수를 가질 수 있으며, 이를 통해 객체를 생성할 때 초기 값을 설정할 수 있습니다. 매개변수가 있는 생성자를 사용하면 객체를 생성할 때 원하는 값으로 필드를 초기화할 수 있습니다.

  • 생성자 내부에서는 보통 this 키워드를 사용하여 클래스의 필드를 참조합니다. this는 현재 객체 자신을 참조하는 키워드입니다. 생성자에서 매개변수의 이름이 필드와 동일할 때, 이를 구분하기 위해 this 키워드를 사용합니다.

parameterAndThis 패키지에 생성

public class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;  // 매개변수 name을 필드 name에 할당
        this.age = age;    // 매개변수 age를 필드 age에 할당
    }
}

this.name은 Person 객체의 필드 name을 가리키고, name은 생성자의 매개변수입니다.

(this.name 은 Person 클래스의 name this.age 는 Person 클래스의 age 를 가리키고있습니다.)

예시에서는 Person 클래스에 매개변수가 있는 생성자를 정의하여, 객체를 생성할 때 이름과 나이를 초기화할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        // 매개변수가 있는 생성자를 사용하여 객체 생성
        Person person1 = new Person("홍길동", 30);
        System.out.println(person1.name);  // 출력: 홍길동
        System.out.println(person1.age);   // 출력: 30
    }
}

생성자 오버로딩

생성자도 메소드처럼 오버로딩이 가능합니다. 즉, 매개변수의 개수나 타입이 다른 여러 개의 생성자를 정의할 수 있습니다. 이를 통해 다양한 방식으로 객체를 생성할 수 있습니다.

예시: 생성자 오버로딩

constructorOverloading 패키지에 생성

public class Person {
    String name;
    int age;

    // 기본 생성자
    public Person() {
        name = "Unknown";
        age = 0;
    }

    // 매개변수가 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

위 클래스에서는 기본 생성자와 매개변수가 있는 생성자가 모두 정의되어 있습니다. 이렇게 하면 객체를 생성할 때 매개변수를 제공할 수도 있고, 제공하지 않을 수도 있습니다.

public class Main {
    public static void main(String[] args) {
        // 기본 생성자를 사용하여 객체 생성
        Person person1 = new Person();
        System.out.println(person1.name);  // 출력: Unknown
        System.out.println(person1.age);   // 출력: 0

        // 매개변수가 있는 생성자를 사용하여 객체 생성
        Person person2 = new Person("홍길동", 25);
        System.out.println(person2.name);  // 출력: 홍길동
        System.out.println(person2.age);   // 출력: 25
    }
}

생성자의 역할

  1. 객체의 초기화: 생성자는 객체가 생성될 때 필드 값을 초기화하고, 필요한 설정을 처리하는 데 사용됩니다.

  2. 다양한 객체 생성 방법 제공: 생성자 오버로딩을 통해 객체 생성 시 다양한 입력값을 받을 수 있어, 객체를 유연하게 생성할 수 있습니다.

  3. 의무적 호출: 객체가 생성될 때 반드시 생성자가 호출됩니다. 따라서 생성자를 통해 초기화가 보장됩니다.

정리

  • 생성자는 객체가 생성될 때 호출되어 객체를 초기화하는 역할을 합니다.

  • 기본 생성자는 매개변수가 없으며, 클래스에 별도의 생성자가 정의되지 않으면 컴파일러가 자동으로 제공합니다.

  • 매개변수가 있는 생성자는 객체를 생성할 때 원하는 값을 받아 필드를 초기화할 수 있습니다.

  • 생성자 오버로딩을 통해 여러 개의 생성자를 정의하여 다양한 방식으로 객체를 생성할 수 있습니다.

  • this 키워드는 생성자 내에서 객체의 필드를 참조할 때 사용됩니다.

클래스의 정적 필드와 정적 메소드

클래스의 정적 필드(static field)와 정적 메소드(static method)는 클래스 자체에 속하는 필드와 메소드를 의미합니다. 일반적으로 클래스의 인스턴스(객체)를 통해 필드와 메소드를 사용하는데, 정적 필드와 메소드는 인스턴스와 관계없이 클래스 자체에 속하며 클래스 이름을 통해 직접 접근할 수 있습니다.

클래스의 정적 필드(static field)

정적 필드는 클래스에 속하는 변수로, 인스턴스마다 따로 존재하는 것이 아니라 클래스 자체에 하나만 존재합니다. 즉, 모든 인스턴스가 동일한 정적 필드를 공유합니다.

정적 필드의 특징

  • 클래스에 하나만 존재하며, 모든 인스턴스가 해당 필드를 공유합니다.

  • 인스턴스가 아닌 클래스 이름으로 접근할 수 있습니다.

  • 클래스 로딩 시 메모리에 할당되며, 프로그램이 종료될 때까지 존재합니다.

정적 필드 선언 예시

staticField 패키지에 생성

public class HanChicken {
    // 정적 필드
    static String brand = "한치킨";
}

위 예시에서 brand는 HanChicken 클래스에 속하는 정적 필드입니다.

정적 필드 사용 예시

public class Main {
    public static void main(String[] args) {
        // 클래스 이름으로 정적 필드에 접근
        System.out.println(HanChicken.brand);  // 출력: 한치킨
    }
}

정적 필드는 클래스 이름을 통해 직접 접근할 수 있으며, 인스턴스를 만들지 않아도 사용할 수 있습니다.

정적 필드와 인스턴스 필드 비교

항목
정적 필드 (Static Field)
인스턴스 필드 (Instance Field)

소속

클래스 자체에 소속

각 인스턴스(객체)에 소속

메모리 할당

클래스가 로딩될 때 한 번만 할당

인스턴스가 생성될 때마다 새로 할당

접근 방법

클래스 이름으로 접근 (예: 클래스명.필드명)

인스턴스를 통해 접근 (예: 객체명.필드명)

클래스의 정적 메소드(static method)

정적 메소드는 클래스에 속하는 메소드로, 인스턴스가 아닌 클래스 자체에 속합니다. 따라서 클래스 이름을 통해 직접 호출할 수 있으며, 인스턴스 필드나 인스턴스 메소드에 접근할 수 없습니다. 이유는 인스턴스 필드나 메소드는 객체가 생성된 후에 사용할 수 있지만, 정적 메소드는 객체 생성 없이 클래스 단위에서 실행되기 때문입니다.

정적 메소드의 특징

  • 클래스 이름을 통해 호출할 수 있습니다.

  • 인스턴스가 없어도 호출 가능하므로, 객체와 관련 없는 작업을 수행할 때 사용됩니다.

  • 정적 메소드 내에서는 정적 필드나 다른 정적 메소드만 사용할 수 있습니다.

  • 정적 메소드 내에서는 this 키워드를 사용할 수 없습니다. (인스턴스와 관계가 없기 때문)

정적 메소드 선언 예시

staticMethod 패키지에 작성

public class HanChicken {
    // 정적 필드
    static String brand = "한치킨";

    // 정적 메소드
    static String contact() {
        return "%s입니다. 무엇을 도와드릴까요?".formatted(brand);
    }
}

위 예시에서 contact() 메소드는 정적 메소드입니다. 클래스 이름을 통해 호출할 수 있으며, 클래스의 정적 필드인 brand에 접근할 수 있습니다.

정적 메소드 사용 예시

public class Main {
    public static void main(String[] args) {
        // 클래스 이름으로 정적 메소드 호출
        System.out.println(HanChicken.contact());  // 출력: 한치킨입니다. 무엇을 도와드릴까요?
    }
}

정적 메소드는 클래스 이름을 통해 직접 호출되며, 인스턴스를 만들지 않아도 사용할 수 있습니다.

정적 메소드와 인스턴스 메소드 비교

항목
정적 메소드 (Static Method)
인스턴스 메소드 (Instance Method)

소속

클래스 자체에 소속

각 인스턴스(객체)에 소속

인스턴스 접근 여부

인스턴스 필드나 메소드에 접근할 수 없음

인스턴스 필드와 다른 인스턴스 메소드에 접근 가능

호출 방법

클래스 이름으로 호출

(예: 클래스명.메소드명())

인스턴스를 통해 호출

(예: 객체명.메소드명())

사용 목적

객체와 관련 없는 작업을 수행할 때 사용

객체의 상태를 조작하거나 관련된 작업을 수행

언제 정적 필드와 메소드를 사용해야 할까?

  1. 공통적인 값이나 기능이 필요할 때:

    • 예를 들어, 모든 HanChicken 인스턴스가 같은 브랜드 이름을 공유한다면, brand 필드를 정적 필드로 선언하여 모든 인스턴스가 동일한 값을 공유하도록 할 수 있습니다.

  2. 객체의 상태와 무관한 메소드:

    • 인스턴스가 없어도 호출할 수 있는 유틸리티 함수(예: 수학 계산, 문자열 조작 등)는 정적 메소드로 작성하는 것이 적절합니다. 예를 들어, Math 클래스의 Math.pow()와 같은 메소드는 정적 메소드입니다.

public class MathUtils {
    // 두 수를 더하는 정적 메소드
    public static int add(int a, int b) {
        return a + b;
    }
}

정리

  • 정적 필드는 클래스에 속하는 변수로, 클래스에 하나만 존재하고 모든 인스턴스가 공유합니다.

  • 정적 메소드는 클래스에 속하는 메소드로, 인스턴스와 관계없이 클래스 이름을 통해 호출할 수 있습니다.

  • 정적 메소드에서는 인스턴스 필드와 메소드에 접근할 수 없고, 정적 필드와 정적 메소드만 사용할 수 있습니다.

  • 정적 필드와 메소드는 객체의 상태와 무관한 공통된 값이나 동작을 정의할 때 유용합니다.

Previous05 메소드NextStatic 보충자료

Last updated 6 months ago