티스토리 뷰

JAVA

[Java Study 05] 클래스(Class)

DevBee 2021. 4. 24. 20:41

클래스

객체를 정의하는 틀 또는 설계도와 같은 의미로 사용되며 추상화라는 개념을 직접 구현하는 것이라고 할 수 있습니다. 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.

 

// Person 이라는 클래스 정의
public class Person {
    // 필드
    String name;
    int age;
    String country;
    
    // 생성자
    public Person() {
    }
    
    public Person(String name, int age, String country) {
        this.name = name;
        this.age = age;
        this.country = country;
    }
    
    // 메소드
    public void greeting() {
        if ("Korea".equals(country)) {
            System.out.println("안녕하세요.");
        } else {
            System.out.println("Hello");
        }
    }
}

 

클래스의 구성 요소

 

✔️생성자(constructor)

: 클래스에서 객체(인스턴스)를 생성할 때 사용하는 메소드입니다. 객체를 생성하면 메모리에 인스턴스가 로드됩니다. 생성자를 사용해 인스턴스를 생성함과 동시에 인스턴스 변수를 초기화 할 수 있습니다. 자바에서 생성자는 클래스명과 동일한 이름을 가집니다.

 

생성자는 다음과 같은 특징이 있습니다.

- 생성자는 반환값이 없지만 반환 타입을 void로 선언하지 않습니다.

- 생성자는 초기화를 위한 데이터를 인자로 전달받을 수 있습니다.

- 생성자 또한 메소드 오버로딩이 가능하여 여러개 존재할 수 있습니다.

 

자바에서는 new 키워드와 함께 생성자를 호출하여 객체를 생성합니다.

 

Person person1 = new Person();  // 기본 생성자
Person person2 = new Person("Alice", 20, "Korea");  // 매개변수를 받는 생성자

 

자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 합니다. 하지만 생성자를 별도로 지정하지 않아도 객체를 생성할 수 있는데 이는 자바 컴파일러가 기본 생성자(default constructor)라는 것을 제공하기 때문입니다. 별도의 생성자가 하나도 정의되어 있지 않다면 다음과 같은 기본 생성자를 추가합니다. 이 기본 생성자는 매개변수를 가지지 않고, 아무런 작업도 하지 않습니다.

 

클래스명() {}

 

만약 매개변수를 가지는 다른 생성자를 하나라도 정의되어 있다면 기본 생성자는 자동으로 추가되지 않습니다.

 

✔️필드(field)

: 클래스에 포함된 변수(variable)를 의미합니다. 클래스 내에서 필드는 선언된 위치에 따라 다음과 같이 구분됩니다.

 

- 클래스 변수(class variable): 클래스 영역에 선언된 변수 중 static 키워드를 가진 변수

- 인스턴스 변수(instance variable): 클래스 영역에 선언되어 있지만 static 키워드가 붙어있지 않은 변수

- 지역 변수(local variable): 메소드나 생성자, 초기화 블록 내에 위치한 변수

 

위 변수들은 다음과 같은 차이를 가지고 있습니다.

변수 생성 시기 소멸 시기 저장 메모리 사용 방법
클래스 변수 클래스가 메모리에 올라갈 때 생성 프로그램이 종료될 때 메소드 영역 클래스명.변수명
인스턴스 변수 인스턴스가 생성될 때 인스턴스가 소멸될 때 힙 영역 인스턴스명.변수명
지역 변수 블록 내에서 변수 선언이 될 때 블록을 벗어날 때 스택 영역 변수명

 

클래스 변수는 인스턴스를 생성하지 않고 바로 클래스명으로 접근할 수 있습니다. 이러한 클래스 변수는 해당 클래스의 모든 인스턴스에서 공유하는 공유 변수입니다.

 

인스턴스 변수는 항상 인스턴스를 생성한 후에 인스턴스명으로 접근 가능하며 각 인스턴스마다 다른 값을 가집니다.

 

class PersonPark {
    static String lastName = "Park";  // 클래스 변수
    String firstName;  // 인스턴스 변수
    
    PersonPark(String name) {
        this.firstName = name;
    }
}

class Main {
    public static void main(String[] args) {
        System.out.println(PersonPark.lastName);  // 인스턴스 생성 없이 접근 가능
        
        PersonPark damiPark = new PersonPark("dami");  // 인스턴스 생성
        System.out.println(damiPark.firstName);  // 인스턴스명으로 접근
        
        PersonPark miriPark = new PersonPark("miri");
        System.out.println(miriPark.firstName);
    }
}

 

✔️메소드(method)

: 클래스 내에서 어떤 작업을 수행하기 위한 명령문의 집합입니다.

 

메소드를 정의하는 방법은 다음과 같습니다.

 

접근제한자 반환타입 메소드명(매개변수타입 매개변수명) {  // 선언 내용
    // 구현 내용
}

 

 

- 접근제한자: 해당 메소드에 접근할 수 있는 범위를 명시하는 것으로 public, protected, private이 있습니다.

- 반환타입(return type): 메소드가 작업을 마치고 반환하는 데이터의 타입을 명시합니다. 메소드 내부에서 return 키워드를 통해 반환값을 넘겨주는데 이때 반환값의 타입을 의미합니다.

- 메소드명: 메소드를 호출할 때 사용하는 이름입니다.

- 매개변수(parameters): 메소드 호출 시 전달되는 인수의 값을 저장할 변수들을 명시합니다.

 

메소드 호출 방법은 다음과 같습니다.

 

Person person = new Person("Alice", 20, "Korea");
person.greeting();

 

메소드 또한 static 키워드를 사용하여 클래스 메소드를 만들 수 있습니다. 단, static 메소드 안에서는 인스턴스 변수에 접근할 수 없습니다. static 메소드가 먼저 메모리에 로드되기 때문에 그때 존재하지 않는 인스턴스 변수에 접근하는 것은 불가능하기 때문입니다.

 

static 메소드는 주로 유틸리티성 메소드를 작성할 때 많이 사용됩니다.

 

import java.text.SimpleDateFormat;
import java.util.Date;


public class DateUtil {
    public static String getCurrentDate(String fmt) {
        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
        return sdf.format(new Date());
    }

    public static void main(String[] args) {
        System.out.println(DateUtil.getCurrentDate("yyyyMMdd"));
    }
}

 

this 키워드

this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는데 사용하는 변수로 해당 인스턴스의 주소를 가리킵니다.

 

public class Person {

    ...
    
    public Person(String name, int age, String country) {
        this.name = name;
        this.age = age;
        this.country = country;
    }
    
    ...
}

 

위의 예제처럼 생성자의 매개변수 이름과 인스턴스 변수의 이름이 같은 경우 인스턴스 변수 앞에 this 키워드를 붙여 구분해주어야 합니다.

 

이렇게 자바에서는 this 키워드를 통해 인스턴스 변수에 접근할 수 있고 this 키워드는 인스턴스 메소드 안에서만 사용할 수 있습니다. 즉, 클래스 메소드에서는 사용이 불가합니다.

 

*** this() 메소드 ***

this() 메소드는 생성자 내부에서만 사용할 수 있으며, 같은 클래스 내 다른 생성자를 호출해야 하는 경우 사용하게 됩니다. this() 메소드에 인자를 전달하면, 생성자 중에 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출하게 됩니다.

 

class Person {
    String firstName;
    String lastName;
    int age;
    
    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    Person(String firstName, String lastName, int age) {
        this(firstName, lastName);  // 다른 생성자를 호출
        this.age = age;
    }
}

 

참고

- 클래스: www.tcpschool.com/java/java_class_intro

- 정적 변수, 메소드: wikidocs.net/228

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함