관리 메뉴

개발그래머

[자바스터디 5주차] 클래스 본문

Java

[자바스터디 5주차] 클래스

임요환 2023. 5. 28. 15:12

목표

  • 자바의 Class에 대해 학습하세요

학습할 것

  • 클래스 정의하는 방법
  • 객체 만드는 방법 (new 키워드 이해하기)
  • 메소드 정의하는 방법
  • 생성자 정의하는 방법
  • this 키워드 이해하기

클래스 정의하는 방법

객체 지향 프로그래밍(OOP, Object Oriented Programming)

  • 모든 데이터를 객체(object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심임
  • 객체의 상태(state)와 행동(behavior)을 구체화하는 형태의 프로그래밍
  • 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 함

클래스(class)

  • 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성
  • 필드(field)란 클래스에 포함된 변수(variable)를 의미 -> 상태, 멤버
  • 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합 -> 행동, 기능

인스턴스(instance)

  • 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화라고 함 -> 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 함
  • 메모리에 할당된 객체
  • 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있으며 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있음
  • 해당 클래스의 모든 메소드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됨

클래스의 구성 요소

public class ClassTest { // 클래스 이름
    String constructorVal; // 필드, 인스턴스 변수
    String instanceVal; // 필드, 인스턴스 변수
    static String classVal; // 필드, 클래스 변수

    { // 인스턴스 초기화 블록
        System.out.println(this.instanceVal);
        this.instanceVal = "instance";
        System.out.println(this.instanceVal);
    }

    static { // 클래스 초기화 블록
        System.out.println(classVal);
        classVal = "class";
        System.out.println(classVal);
    }

    public ClassTest(){
        // super(); // 상속시 super 생성자 생략되어있음
    }

    public ClassTest(String constructorVal) { // 생성자
        // super(); // 상속시 super 생성자 생략되어있음
        this.constructorVal = constructorVal;
    }

    public void callMyNameWithCount(int count){ // 인스턴스 메소드
        String myName = this.getClass().getName();// 지역 변수
        for(int i = 0; i < count; i++){
            System.out.println(myName);
        }
    }

    public static void callMyClassVal(){ // 클래스 메소드
        System.out.println(classVal);
    }

    public static void main(String[] args) {
        ClassTest instance = new ClassTest("constructor");
        instance.callMyNameWithCount(5);

        ClassTest.callMyClassVal();
    }
}
  • 클래스 초기화 -> 인스턴스 초기화 -> 생성자 초기화 순으로 진행됨

접근 제어자

  • public > protected > default > private
접근 제어자 같은 클래스의멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
public O O O O
protected O O O X
default O O X X
private O X X X

필드

  • 클래스에 포함된 변수를 의미함
  • 선언된 위치에 따라 구분됨
변수 생성 시기 소멸 시기 저장 위치
클래스 변수(static variable), 공유변수(shared variable) 클래스가 메모리에 올라갈 때 프로그램이 종료될 때 메소드 영역
인스턴스 변수(instance variable) 인스턴스가 생성될 때 인스턴스가 소멸할 때 힙 영역
지역 변수(local variable) 블록 내에서 변수의 선언문이 실행될 때 블록을 벗어날 때 스택 영역

inner class 컴파일

public class Point {
    int x;
    class InnerPoint {
        int z;
        class InnerInnerPoint {
            int y;
        }
    }
}
  • Point 클래스를 컴파일하게 되면 Point.class, Point$InnerPoint.class, Point$InnerPoint$InnerInnerPoint.class로 3개의 클래스파일이 생성됨

객체 만드는 방법(new 키워드 이해하기)

ClassTest classTest = new ClassTest();
ClassTest classTest = new ClassTest("ctor");
  • new 키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출됨

메소드 정의하는 방법

//1      2        3                 4
public void callMyNameWithCount(int count){// 선언부
    //구현부
    String myName = this.getClass().getName();
    for(int i = 0; i < count; i++){
        System.out.println(myName);
    }
}

ClassTest classTest = new ClassTest();
classTest.callMyNameWithCount(5); // 메소드 호출
  1. 접근제어자 = 해당 메소드에 접근할 수 있는 범위(private, public...)
  2. 반환 타입(return type) = 메소드가 모든 작업을 마치고 반환하는 데이터의 타입(String, Integer, Object, int...)
  3. 메소드 이름 = 메소드를 호출하기 위한 이름
  4. 매개변수 목록(parameters) = 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들
  5. 구현부 = 메소드의 고유 기능을 수행하는 명령문의 집합
  • 자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없지만 메소드 오버로딩을 이용하여 같은 이름의 메소드를 중복하여 정의 가능
  • 메소드 오버로딩(overloading) = 매개변수의 개수나 타입을 다르게 하여 같은 이름의 또 다른 메소드를 작성 가능

메소드

  • 특정 작업을 수행하기 위한 명령문의 집합
  • 메소드를 사용하면 중복되는 코드의 반복적인 프로그래밍을 피할 수 있음
  • 모듈화로 인해 전체적인 코드의 가독성 향상
  • 기능의 변경이 필요할 때도 쉽게 유지보수 가능
메소드 설명
클래스 메소드(static method) static 키워드를 가지는 메소드, 클래스 변수와 마찬가지로 인스턴스를 생성하지 않고도 바로 사용, 메소드 내부에서 인스턴스 변수를 사용할 수 없음
인스턴스 메소드(instance method) static 키워드를 가지지 않는 메소드

생성자 정의하는 방법

public ClassTest(){ // 매개변수가 없는 생성자, 기본 생성자
} 

public ClassTest(String constructorVal) { // 매개변수가 있는 생성자
    System.out.println(this.constructorVal);
    this.constructorVal = constructorVal;
    System.out.println(this.constructorVal);
}

ClassTest classTest = new ClassTest();
ClassTest classTest = new ClassTest("ctor");

생성자

  • 객체 생성 시 해당 객체는 메모리에 즉시 생성되지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태임
  • 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공
  • 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 함
  • 반환값이 없지만, 반환 타입을 void형으로 선언하지 않음
  • 초기화를 위한 데이터를 인수로 전달받을 수 있음
  • 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있음

기본 생성자(default constructor)

  • 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 하지만 성자를 정의하지 않으면 자바 컴파일러가 기본 생성자(default constructor)라는 것을 기본적으로 제공해 줌
  • 매개변수를 하나도 가지지 않으며, 아무런 명령어도 포함하고 있지 않음
  • 매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 자동으로 추가되지 않음

this 키워드 이해하기

public ClassTest(String constructorVal) {
    String constructorVal = "ctorv"; // 이럴경우
    this.constructorVal = constructorVal; // 인스턴스 변수 this 필수
}
  • this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수
  • this 참조 변수는 해당 인스턴스의 주소를 가리킴
  • 생성자의 매개변수 이름과 인스턴스 변수의 이름이 같을 경우에는 인스턴스 변수 앞에 this 키워드를 붙여 구분해야 함
  • this 참조 변수를 사용할 수 있는 영역은 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없음

this() 메소드

public ClassTest(){
    this("defaultCtor");
}

public ClassTest(String constructorVal) {
    this.constructorVal = constructorVal; // 인스턴스 변수 this 필수
}
  • 생성자 내부에서만 사용할 수 있으며, 같은 클래스의 다른 생성자를 호출할 때 사용
  • 인수를 전달하면, 생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출
  • 한 생성자에서 다른 생성자를 호출할 때에는 반드시 해당 생성자의 첫 줄에서만 호출 가능

'Java' 카테고리의 다른 글

[자바스터디 6주차] 상속  (0) 2023.06.02
[자바스터디 5주차] 과제  (0) 2023.06.01
[자바스터디 4주차] 과제  (0) 2023.05.27
[자바스터디 4주차] 제어문  (0) 2023.05.18
[자바스터디 3주차] 연산자  (0) 2023.05.13