과목명 : 객체지향 프로그래밍(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) 인스턴스 변수 초기화 시점 - 인스턴스(객체)가 생성될 때마다 초기화됩니다.
- 클래스 변수가 먼저 초기화되고 이후 인스턴스 변수가 초기화됩니다.
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.
'전공 수업 > 객체 지향 프로그래밍(Java)' 카테고리의 다른 글
[13주 차] - 제어자, 접근 제어자, 캡슐화, 다형성 (0) | 2022.11.27 |
---|---|
[12주 차] - 클래스 상속, 메서드 오버라이딩, 참조변수 super, 생성자 super(), 패키지와 import문 (0) | 2022.11.20 |
[10주 차] - 클래스 변수, 인스턴스 변수, 지역 변수, 클래스 메서드와 인스턴스 메서드 (0) | 2022.11.06 |
[9주 차] - 메서드의 개념, 클래스와 객체 (0) | 2022.11.04 |
[7주 차] - Math.random() 메서드, 제어문(반복문, 조건문)을 사용한 코드 예제 (0) | 2022.10.12 |
댓글