티스토리 뷰
🟩 생성자 오버로딩
매개값으로 객체의 필드를 다양하게 초기화하려면 생성자 오버로딩(Constructor Overloading)이 필요하다.
생성자 오버로딩이란, 매개변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.
ex)
class User {
private int age;
private int height;
private String name;
public User() {};
public User(int age) {
this.age = age;
};
public User(int age, int height) {
this.age = age;
this.height = height;
}
public User(int age, int height, String name) {
this.age = age;
this.height = height;
this.name = name;
}
}
단, 매개변수의 타입과 개수, 그리고 선언된 순서가 똑같을 경우, 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아니다.
다음은 그 예시이다.
Car(String model, String color) { ... };
Car(String color, String model) { ... }; // 오버로딩 아님, 컴파일 에러 발생함!
🟩 this()
하지만, 생성자 오버로딩이 많아질 경우, 생성자 간의 중복된 코드가 발생할 수 있다.
아래는 그 예시이다. ( 오버로딩된 생성자들끼리 중복된 코드가 보인다. )
class User {
private int age;
private int height;
private String name;
public User() {
this.age = 20;
this.height = 172;
this.name = "asdf";
};
public User(int age) {
this.age = age;
this.height = 172;
this.name = "asdf";
}
public User(int age, int height) {
this.age = age;
this.height = height;
this.name = "asdf";
}
public User(int age, int height, String name) {
this.age = age;
this.height = height;
this.name = name;
}
}
이 경우, 공통 코드를 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 this()를 사용하여 공통 코드를 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.
class User {
private int age;
private int height;
private String name;
public User() {};
public User(int age) {
this(age, 172, "asdf");
}
public User(int age, int height) {
this(age, height, "asdf");
}
public User(int age, int height, String name) {
this.age = age;
this.height = height;
this.name = name;
}
}
this()는 생성자의 첫 줄에 작성되며, 다른 생성자를 호출하는 역할을 한다.
🟩 가변길이 매개변수, 메서드 오버로딩
매개변수의 갯수와 상관없이 매개값을 주고 싶을 때, 가변길이 매개변수 문법을 사용할 수 있다.
가변길이 매개변수는 다음과 같이 선언한다.
int sum(int ... values) {
// ~~
}
또 메서드 오버로딩에 대해서도 설명해보자면,
메소드 이름은 같되, 매개변수의 타입, 개수, 순서가 다른 메소드를 여러개 선언하는 하는 것을 말한다.
아래는 그 예시이다.
int plus(int x, int y) {
int result = x + y;
return result;
}
double plus(double x, double y) {
double result = x + y;
return result;
}
또, 이 가변 길이 매개변수와 메서드 오버로딩 개념을 함께 사용한 예제이다. (향상된 for문도 사용되었다!)
class Calculator {
public int sum(int ... values) {
int sum = 0;
for (int value : values) {
sum += value;
}
return sum;
}
public double sum(double ... values) {
double sum = 0;
for (double value : values) {
sum += value;
}
return sum;
}
}
class HelloWorld {
public static void main(String[] args) {
Calculator c = new Calculator();
System.out.println(c.sum(1, 2, 3, 4, 5));
System.out.println(c.sum(1.0, 2.0, 3.0, 4.0, 5.0));
}
}
메서드 오버로딩에 관한 글을 1년 전에 정리했었었다...!! 하지만 당시에는 이해를 잘 못했기때문(?)에, 처음본 내용인 줄 알고있었다.. ㅋㅋ
https://kodong8774.tistory.com/54
자바 - 메서드 오버로딩(Method Overloading) - "메서드의 이름만같으면 동일한 메서드 아닌가? 하나의
public class ProcessMessage { public static void printProcessMessage() { // 아무것도 실행하지 않음 } public static void printProcessMessage(String action) { if ("execute".equals(action)) { System.out.println("실행 중입니다! 💪"); // 실
kodong8774.tistory.com
🟩 final 필드와 상수
값을 변경하는 것을 막고, 읽기만 허용해야할 때,
우리는 final 필드와 상수를 선언해서 사용한다.
final 필드는 초기값이저장되면 이것이 최종적인 값이 되어, 프로그램 실행 도중에 수정할 수 없게 된다.
즉, fianl 필드에 초기값을 줄 수 있는 방법은 다음 두 가지밖에 없다.
1. 필드 선언 시에 초기값 대입
2. 생성자에서 초기값 대입
아래는 그 예시이다.
public class ABCSchoolStudent {
// 인스턴스 final 필드 선언
final String school = "ABC";
final int age;
// 인스턴스 필드 선언
final String club; // 동아리
public ABCSchoolStudent(int age, String club) {
this.age = age;
this.club = club;
}
}
🔵 다음으로 상수 선언에 대해서 알아보자.
상수는 객체마다 저장할 필요가 없고, 여러 개의 값을 가져도 안되기 때문에,
static이면서 final인 특성을 가져야한다.
또 상수 이름은 대문자로 작성하는 것이 관례이다.
static final double PI = 3.14;
🟩 패키지
자바의 패키지(package)는 단순히 디렉토리만을 의미하는 것이 아니며,
패키지는 클래스의 일부분이며, 클래스를 식별하는 용도로 사용된다.
그리고,
패키지는 주로 개발 회사 도메인 이름의 역순으로 만든다.
예를 들어서, mycompany.com 회사의 패키지는 com.mycompany로,
yourcompany.com 회사의 패키지는 com.yourcompay로 만든다.
---------------------
( 헷갈렸던 부분 + 몰랐던 부분만 짧게 정리함 )