본문 바로가기
전공 수업/객체 지향 프로그래밍(Java)

[11주 차] - 메서드 오버로딩, 생성자, 참조변수 this, 멤버 변수 초기화

by TwoJun 2022. 11. 10.

    과목명 : 객체지향 프로그래밍(Object oriented programming)

수업일자 : 2022년 11월 09일 (수)

 

 

 

 

 

1. 메서드 오버로딩(Overloading)

1-1. 메서드 오버로딩의 정의

- 하나의 클래스 안에 동일한 이름을 가진 메서드를 여러 개 정의하는 것을 의미합니다.

 

- 동일한 기능을 수행하는 메서드를 하나의 이름으로 정의하고, 메서드의 이름을 절약할 수 있기에 오버로딩이 사용됩니다.

 

 

 

1-2. 오버로딩의 성립 조건

- 메서드명이 동일해야 합니다.

 

- 매개변수의 개수 또는 매개변수의 데이터 타입이 달라야 합니다.

 

- 매개변수는 같고, 리턴 타입이 다른 경우는 오버로딩을 할 수 없습니다.

(리턴 타입은 오버로딩에 아무런 영향을 주지 않습니다.)

 

 

 

 

1-3. 오버로딩이 성립하지 않는 경우 

(1) 매개변수명 불일치

// 두 메서드의 파라미터명이 다르더라도 오버로딩이 아닙니다.
int numberAdd(int x, int y) { return x + y; }
int numberAdd(int a, int b) { return a + b; }

 

 

(2) 메서드의 반환 타입은 오버로딩과 관계가 없습니다.

// 메서드의 반환 타입은 오버로딩과 관계가 없습니다.
int numberAdd(int x, int y) { return x + y; }
int numberAdd(int x, int y) { return (long) (x + y); }

 

 

 

 

1-4. 오버로딩이 성립하는 경우

(1) 매개변수의 데이터 타입이 다르므로 오버로딩이 성립합니다.

// 오버로딩의 성립 : 파라미터의 데이터 타입이 다른 경우
long numberAdd(int x, long y) { return x + y; }
long numberAdd(long x, int y) { return x + y; }

 

 

(2) 올바른 메서드 오버로딩의 코드 예시

int numberAdd(int a, int b) { return a + b; }

long numberAdd(long a, long b) { return a + b; }

// 배열을 매개변수로 받아서 배열 내의 모든 성분을 순회하며 더한다. 
int numberAdd(int[] array) {
	int result = 0;
	for(int i = 0; i < array.length; i++) { result += array[i]; }
    return result;
}

 

 

 

 

 

 

2. 생성자(Constructor)

2-1. 생성자의 정의

- 클래스로부터 클래스의 인스턴스(객체)가 생성될 때마다 호출되는 메서드로써, 생성된 객체의 초기화를 담당합니다.

 

 

 

2-2. 생성자의 특징

- 인스턴스 생성 시, 인스턴스 변수의 초기화에 사용됩니다.

 

- 기본 생성자를 제외한 나머지 생성자는 클래스 내부에서 정의되어야 해당 생성자를 호출하여 사용할 수 있게 됩니다.

// 기본 생성자 호출
ClassGenerator cg1 = new ClassGenerator();

 

 

 

2-3. 생성자의 조건

- 생성자의 이름은 클래스명과 동일해야 합니다.

 

- 반환 타입이 없습니다. (항상 반환 타입이 없으므로 void는 따로 붙이지 않습니다.)

 

- 모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 합니다.

 

 

 

 

2-4. 기본 생성자(Default constructor)

- 매개변수를 가지지 않는 생성자를 의미합니다.

 

- 클래스 내부에 생성자가 하나도 없을 때, 자바 컴파일러(Javac)가 자동으로 추가합니다.

class Car1 {
    String color;
}

class Car2 {
	String color;
    
    // 매개변수를 가지는 생성자 추가
    Car2(String carColor) { color = carColor; }
}


class ConstructorExample {
    public static void main(String[] args) {
        // 기본 생성자를 호출하여 Car1 객체 생성
        Car1 c1 = new Car1();
        
        /* 컴파일 오류 발생 : 클래스에 파라미터를 가지는 생성자가 존재하므로 기본 생성자가 
        컴파일러에 의해 생성되지 않아서 기본 생성자를 호출할 수 없다.
        // Car2 c2 = new Car2();
    }
}

 

 

 

 

2-5. 매개변수를 가지는 생성자

- 아래의 클래스를 한 번 살펴보겠습니다.

class UserInfo {
    String userName;
    String userJob;
    int userAge;
    
    // 기본 생성자 정의
    UserInfo() {}
    
    // 매개변수를 가지는 생성자 정의
    UserInfo(String name, String job, int age) {
        userName = name;
        userJob = job;
        userAge = age;
    }
}

 

 

 

- 위처럼 매개변수를 갖는 생성자가 정의되어 있으므로 아래와 같이 인스턴스 변수를 보다 더 짧은 코드를 사용하여 초기화가 가능하다는 장점이 있습니다.

// 객체 생성과 동시에 인스턴스 변수를 초기화하는 생성자 호출
UserInfo ui1 = new UserInfo("wonjun", "student", 25);

 

 

 

 

 

 

3. 생성자 this(), 참조변수 this

3-1. 생성자 this()의 정의

- 생성자 내부에서 다른 생성자를 호출할 때 사용합니다.

 

- 다른 생성자들끼리 호출할 때는 생성자의 첫 줄에서 호출합니다.

 

- 동일한 클래스 내에서 생성자들끼리 호출 시, 클래스명 대신 this를 사용합니다.

class UserInfo {
    String userName;
    String userJob;
    int userAge;
    
    // 생성자 this를 이용하여 다른 생성자 호출
    UserInfo() { this("wonjun", "student", 25); }
    
    UserInfo(String name, String job, int age) {
        userName = name;
        userJob = job;
        userAge = age;
    }
}

 

 

 

 

3-2. 참조변수 this

- 생성된 객체(클래스의 인스턴스) 자신을 가리키는 참조변수입니다.

 

- 생성된 인스턴스의 주소를 가지며, 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재합니다.

 

- 지역변수와 인스턴스 변수를 구별할 때 사용합니다.

class UserInfo {
    // 인스턴스 변수
    String userName;
    String userJob;
    int userAge;
    
    // 참조변수 this는 생성자 내의 지역변수, 인스턴스 변수를 구분하기 위해 사용된다.
    UserInfo(String name, String job, int age) {
        // 인스턴스 변수 = 지역 변수
        this.userName = name;
        this.userJob = job;
        this.userAge = age;
    }
}

 

 

 

 

3-3. 생성자를 이용한 인스턴스 복사

- 클래스에서 정의한 생성자에서 만들어진 객체의 참조변수를 매개변수로 받아서 생성된 객체들의 인스턴스 변수의 값을 복사합니다. 

 

- 이를 통해 동일한 속성을 갖게 되는 또 다른 객체가 만들어집니다.

class UserInfo {
    String userName;
    String userJob;
    int userAge;
    
    // 생성자 this를 이용하여 다른 생성자 호출
    UserInfo() { this("wonjun", "student", 25); }
    
    UserInfo(String name, String job, int age) {
        this.userName = name;
        this.userJob = job;
        this.userAge = age;
    }
    
    // 생성된 객체의 값을 저장하기 위한 새로운 생성자 정의
    UserInfo(UserInfo ui) { this(ui.userName, ui.userJob, ui.userAge); }
}

class ThisConstructorExample {
    public static void main(String[] args) {
        UserInfo ui1 = new UserInfo();
        
        // 생성된 객체의 인스턴스 변수에 할당된 값을 전달받아 새로운 객체를 생성한다.
        UserInfo ui2 = new UserInfo(ui1);
        }
}

 

 

 

 

 

 

4. 변수의 초기화(Initialization of variable)

4-1. 변수의 초기화, 여러 가지 특징

- 변수의 초기화란, 변수를 선언 후 변수에 처음으로 특정 데이터를 저장하는 것을 의미합니다.

 

- 멤버 변수(인스턴스 변수, 클래스 변수)와 배열은 각 데이터 타입마다 Default 값으로 초기화됩니다.

 

- 지역변수는 초기화되지 않으므로 반드시 초기화 후 변수를 사용해야 합니다.

 

- 동일한 데이터 타입을 가지는 변수들은 콤마(,)를 사용해서 선언 & 초기화가 가능합니다.

 

- 데이터 타입이 다른 변수끼리는 함께 선언하거나 초기화할 수 없습니다.

데이터 타입 기본값
Boolean false
char '\u0000'
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수  null

 

 

 

4-2. 멤버변수 초기화

- 멤버변수 초기화에는 다음과 같이 세 가지 방식이 존재합니다.

 

(1) 명시적 초기화(Explicit initialization)

class UserInfo {
    // 멤버변수의 명시적 초기화
    String userName = "wonjun";
    String userJob = "student";
    int userAge = 25;
}

 

 

(2) 생성자를 이용한 초기화 (인스턴스 변수 초기화, 복잡한 초기화에 사용됩니다.)

// 생성자를 이용하여 인스턴스 변수 초기화
UserInfo(String name, String job, int age) {
        this.userName = name;
        this.userJob = job;
        this.userAge = age;
    }

 

 

 

(3) 초기화 블록(Initialization block) - 복잡한 초기화가 필요할 때 초기화 블록을 사용합니다.

- 초기화 블록은 생성자보다 먼저 호출되며, static 키워드의 유무에 따라 다음과 같이 구분됩니다.

 

(3-a) 인스턴스 초기화 블록

- 중괄호 {} 만을 이용해 정의합니다.

 

- 인스턴스가 생성될 때마다 실행되나, 생성자보다 먼저 실행됩니다.

 

- 생성자와 인스턴스 초기화 블록의 차이가 거의 없는 편이므로, 인스턴스 초기화 블록은 생성자보다 잘 사용되지 않은 항목입니다.

 

- 여러 개의 생성자가 존재하고 공통적으로 수행되어야 할 코드를 인스턴스 초기화 블록에 포함해 코드의 중복을 줄일 수 있다는 특징이 존재합니다. (생성자에서 공통적으로 수행되는 작업에 사용됩니다.)

 

 

(3-b) 클래스 초기화 블록

- 기존 인스턴스 초기화 블록에 static 키워드를 추가하여 정의합니다.

 

- 클래스 변수의 복잡한 초기화에 사용됩니다.

 

- 클래스 초기화 블록은 생성자, 인스턴스 초기화 블록으로는 초기화가 불가능한 클래스 변수의 초기화를 수행할 때 사용합니다. 

 

 

 

 

 

4-3. 멤버변수의 초기화 시점

(1) 클래스 변수의 초기화 시점 - 클래스가 처음 메모리에 적재될 때(로딩될 때) 한 번 초기화됩니다.

(2) 인스턴스 변수 초기화 시점 - 인스턴스(객체)가 생성될 때마다 초기화됩니다.

 

- 클래스 변수가 먼저 초기화되고 이후 인스턴스 변수가 초기화됩니다.

 

 

 

 

 

 

 

 

- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.

- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.

 

댓글