본문 바로가기
dev/기본쌓기

[JAVA] 빠르게 정리하는 자바 문법 (4)

by dev-everyday 2024. 12. 31.
반응형
더보기

해당 글은 아래 링크를 참고하여 작성되었습니다.

https://www.tcpschool.com/java/java_class_intro

6. 클래스

1. 클래스의 개념

객체 지향 프로그래밍(OOP, Object-Oriented Programming)에서는 모든 데이터를 객체로 취급한다.

이런 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스라고 한다.

자바에서 클래스는 객체를 정의하는 틀 또는 설계도와 같은 의미다.

클래스는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메소드로 구성된다.

필드는 클래스에 포함되는 변수이고 메소드는 어떤 작업을 수행하기 위한 명령문의 집합이라 할 수 있다.

 

인스턴스는 자바에서 클래스를 사용하기 위해 해당 클래스 타입의 객체를 선언하는데 이 과정을 인스턴스화라고 하고 이렇게 선언된 클래스 타입의 객체를 인스턴스라고 한다.

즉, 인스턴스는 메모리에 할당된 객체이다.

생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있으나 해당 클래스의 모든 메소드를 모든 인스턴스가 공유한다.

 

메소드를 정의하는 방식은 아래와 같다.

접근제어자 반환타입 메소드이름(매개변수목록) { // 선언부
    // 구현부
}

접근 제어자의 경우 해당 메소드에 접근할 수 있는 범위로 public, private, protected 등이 있다.

자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없다.

메소드 오버로딩을 이용하여 같은 이름의 메소드를 정의하는 것은 가능한데 매개변수의 개수나 타입은 달라야 한다.

 

2. 클래스의 구성

자바에서 클래스는 멤버로 속성을 표현하는 필드와 기능을 표현하는 메소드를 가진다.

클래스는 생성된 객체의 필드를 초기화해주는 특별한 메소드인 생성자를 가진다.

 

1) 필드

클래스의 필드는 클래스에 포함된 변수를 의미한다.

클래스 내 필드는 선언 위치에 따라 클래스 변수(static variable), 인스턴스 변수(instance variable), 지역 변수(local variable)로 구분된다.

 

2) 메소드

메소드는 어떤 특정 작업을 수행하기 위한 명령문의 집합이다.

 

3) 생성자

클래스를 가지고 객체를 생성하면 해당 객체는 메모리에 즉시 생성되는데 인스턴스 변수 초기화가 필요하다.

따라서 자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자라는 메소드를 제공한다.

자바에서 생성자의 이름은 해당 클래스의 이름과 같아야 한다.

 

3. 클래스의 선언

자바에서 클래스는 아래와 같이 선언한다.

접근제어자 class 클래스이름 {
    접근제어자 필드1의타입 필드1의이름;
    접근제어자 필드2의타입 필드2의이름;
    ...
    접근제어자 메소드1의 원형
    접근제어자 메소드2의 원형
    ...
};

위와 같이 선언된 클래스의 정의를 가지고 아래와 같이 객체의 인스턴스를 생성한다.

클래스이름 객체참조변수이름;
// Car myCar;

객체참조변수이름 = new 클래스이름();
// myCar = new Car();

7. 메소드와 생성자

1. 메소드의 개념

클래스에서 메소드를 작성하여 사용하는 이유는 중복되는 코드의 반복적인 프로그래밍을 피할 수 있기 때문이다.

모듈화로 인해 코드의 가독성이 좋아지고 유지보수가 좋다.

메소드를 정의하는 방식은 아래와 같다.

접근제어자 반환타입 메소드이름(매개변수목록) { // 선언부
    // 구현부
}

1. 접근 제어자 : 해당 메소드에 접근할 수 있는 범위를 명시한다.

2. 반환 타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시한다.

3. 메소드 이름 : 메소드를 호출하기 위한 이름을 명시한다.

4. 매개변수 목록(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시한다.

5. 구현부 : 메소드의 고유 기능을 수행하는 명령문의 집합이다.

 

2. 생성자

자바에서 클래스 변수와 인스턴스 변수는 별도로 초기화하지 않으면, 다음 값으로 자동 초기화된다.

char '\u0000'
byte, short, int 0
long 0L
float 0.0F
double 0.0 또는 0.0D
boolean false
배열, 인스턴스 등 null

 

생성자는 아래와 같은 특징을 가진다.

1. 생성자는 반환값이 없지만, 반환 타입을 void형으로 선언하지 않는다.

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

3. 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.

생성자도 하나의 메소드이므로 메소드 오버로딩이 가능하다.

 

자바 컴파일러가 기본 생성자라는 것을 제공하는데 매개변수를 하나도 가지지 않고 명령어를 포함하고 있지 않다.

자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않으면, 자동으로 다음과 같은 기본 생성자를 추가한다.

클래스이름() {}

 

3. this와 this()

this 참조 변수는 인스턴스가 바로 자기 자신을 참조하는 데 사용하는 변수다.

이러한 this 참조 변수는 해당 인스턴스의 주소를 가리키고 있다.

이러한 this 참조 변수를 사용할 수 있는 영역은 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없다.

 

this() 메소드는 생성자 내부에서만 사용할 수 있으며 같은 클래스의 다른 생성자를 호출할 때 사용한다.

this() 메소드에 인수를 전달하면 생성자 중에서 메소드 시그니처가 일치하는 다른 생성자를 찾아 호출한다.

메소드 시그니처(method signature)란 메소드의 이름과 메소드의 원형에 명시되는 매개변수 리스트를 가리킨다.

 

4. 메소드 오버로딩

메소드 오버로딩의 핵심은 바로 메소드 시그니처(method signature)에 있다.

메소드 시그니처란 메소드의 선언부에 명시되는 매개변수의 리스트를 가리킨다.

메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미한다.

메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있다.

이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있다.

메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나다.

메소드 오버로딩의 대표적인 예로는 println() 메소드가 있다.

1. println()
2. println(boolean x)
3. println(char x)
4. println(char[] x)
5. println(double x)
6. println(float x)
7. println(int x)
8. println(long x)
9. println(Object x)
10. println(String x)

 

자바에서 메소드 오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.

1. 메소드의 이름이 같아야 한다.

2. 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 한다.

 

 

5. 재귀 호출

재귀 호출(recursive call)이란 메소드 내부에서 해당 메소드가 또다시 호출되는 것을 의미한다.

int recursiveSum(int n) {
    if (n == 1) {                 // n이 1이면, 그냥 1을 반환함.
        return 1;
    }
    return n + recursiveSum(n-1); // n이 1이 아니면, n을 1부터 (n-1)까지의 합과 더한 값을 반환함.
}

 

반응형