럿고의 개발 노트
[프로그래머스] 자바 입문 > Part6. 클래스 다듬기 본문
[프로그래머스] 자바 입문
Part6. 클래스 다듬기
1. 생성자
생성자
모든 클래스는 인스턴스화 될때 생성자를 사용함
생성자의 특징
- 리턴타입이 없음
- 생성자를 만들지 않으면 매개변수가 없는 생성자가 컴파일 시 자동 생성
- 매개변수가 없는 생성자를 기본생성자라고 함
- 생성자를 만들었다면, 기본생성자는 자동으로 만들어 지지 않으며, 기본생성자를 사용하기 위해서는 수동으로 지정해줘야 함.
생성자의 역할은 객체가 될 때 필드를 초기화 함
public class Car {
String name; // 필드
int number; // 필드
// 여기까지 생성자가 없다면 기본생성자가 만들어짐, 그러나 아래처럼 생성자를 만들면 기본생성자가 생성되지 않음
// 생성자가 하는 일은 객체가 될때 필드를 초기화 하는 역할
public Car(String n) { // 생성자를 이렇게 만들면, 이름을 생성자를 만들때 이름을 지정해줘야 함.
name = n;
}
}
public class CarExam {
public static void main(String[] args) {
//Car c1 = new Car(); // Car()은 여기서 생성자가 됨
// 생성자란, 인스턴스를 만들려면 new라는 연산자가 필요
// new라는 연산자 이후에 생성자가 필요
/* 생성자 선언
* public class 클래스명 {
* 타입 필드명;
* public 클래스명(매개변수 목록) { // 생성자로 메소드와 달리 리턴타입을 가지고 있지 않음
*
* }
*/
// 생성자 특징
// 1. 리턴타입이 없음
// 2. 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일 시 자동 생성
// 3. 매개변수가 없는 생성자를 기본 생성자
// 4. 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 생성되지 않음
// Car클래스에서 생성자를 만들어 줬기 때문에 기본 생성자로는 생성자를 생성할 수 없음
Car c1 = new Car("소방차");
Car c2 = new Car("구급차");
System.out.println(c1.name); // 이름이 소방차로 초기화
System.out.println(c2.name); // 이름이 구급차로 초기화
}
}
2. this
this
현재 객체 즉, 자기 자신을 타나냄
클래스 안에 자기 자신이 가지고 있는 필드를 사용할 때 this.필드명으로 호출 가능
자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출 가능
this를 사용하는 이유는 매개변수명과 필드명이 중복이 가능하다 보니, 둘 중에 어느 것이 필드인지, 매개변수 인지를 구분하기 위해서 임.
또한 메소드 내에서 변수명을 사용하면, 가장 늦게 선언된 매개변수에 값이 저장될 것이므로 서로 구분해서 this는 키워드를 사용하는 것이 좋음
(습관화 필요!)
public class Car2 {
String name;
int number;
public Car2(String name) { // 생성자 지정
// 이때 n이 number의 약자인지, name의 약자인지 알수가 없음
// 변수를 사용할때는 한눈에 알아볼수 있도록 사용하는 것이 좋음
// 따라서 name을 받기 위해서는 name으로 받는 것이 좋음
// 그러나 이렇게 하면 위에서 필드와 매개변수가 이름이 똑같기 때문에 가장 가까운 name으로 지정한 곳을 찾게 됨
// 따라서 아래의 name은 둘 다 매개변수 name으로 인식
// 그래서 각자의 이름을 구분시켜줘야함.
// 그때 사용하는게 this 키워드로, 내 구성요소, 내 것이라고 생각하면 되고, this가 있다면 내 필드에 값을 넣어달라고 하는 것
this.name = name;
// 그리고 자기 자신이 가지고 있는 메소드를 사용하고 싶을떄에도 this라는 키워드를 사용
// this.메소드명으로 메소드를 호출할수 있음
// 나의 생성자를 호출할때도 this키워드를 사용할수 있음
// this는 객체 자신을 참조하는 키워드라고 생각하면 됨
}
}
public class CarExam2 {
public static void main(String[] args) {
Car2 c1 = new Car2("소방차");
Car2 c2 = new Car2("구급차");
}
}
3. 메소드 오버로딩
메소드 오버로딩
매개변수의 유형, 개수를 다르게 하여 같은 이름의 메소드를 여러 개 가질 수 있게 함
메소드의 인자에 어떤 값을 쓰이느냐에 따라서 각기 다른 메소드가 호출됨.
public class MyClass {
// 매개변수의 갯수나 타입이 조금씩 다르지만 비슷한 기능을 하는 메소드가 여러개 있을수도 있음
// 이런 메소드들이 다른 이름으로 정의되어 있으면 해깔리는데 이런 문제를 해결하는 방법은 메소드 오버로딩을 사용하면 됨
// 메소드 오버로딩이란 매개변수의 유형과 개수가 다르게 하여 같은 이름의 메소드를 여러 개 가질 수 있게 하는 기술
public int plus (int x, int y) { // 정수형 x, y를 매개변수로 받아서 정수형 x + y으로 리턴
return x + y;
}
public int plus (int x, int y, int z) { // 정수형 x, y, z를 매개변수로 받아서 정수형 x + y + z으로 리턴
return x + y + z;
}
public String plus(String x, String y) { // String x, y를 매개변수로 받아 String x+y로 리턴
return x + y;
}
// 위의 3개의 메소드를 같은 이름으로 매개변수와 리턴타입을 다르게 설정했지만 오류가 발생하지 않음
// 매개변수 유형과 개수를 다르게 하거나 리턴타입을 다르게 해서 같은 메소드 이름으로 지정하는 것을 오버로딩이라고 함
// public int plus(int i, int j) { }
// 위처럼 이미 매개변수 2개를 받는 경우를 지정했을때 변수명이 다르다고 해서 다른것은 아님. 한번 메소드를 지정한 후 또 지정하면 오류 발생
}
public class MethodOverLoadExam {
public static void main(String[] args) {
MyClass m = new MyClass();
System.out.println(m.plus(4, 5)); // 메소드 실행 : 9
System.out.println(m.plus(4, 5, 6)); // 메소드 실행 : 15
System.out.println(m.plus("Hello", "World")); // 메소드 실행 : HelloWrold
}
}
4. 생성자 오버로딩과 this
생성자 오버로딩
생성자의 매개변수의 유형과 개수를 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있음
자기 생성자를 호출하는 this()키워드도 있음
자기 자신의 생성자를 호출함으로써 중복 코드를 방지
public class Car3 {
String name;
int number;
public Car3(String name) {
this.name = name;
}
// 생성자 오버로딩이란, 매소드와 마찬가지로 매개변수의 수와 타입이 다르다면 여러개의 생성자를 가질 수 있음
// 생성자를 정의를 하면 기본생성자가 만들어지지 않는다고 했는데, 기본생성자를 직접 정의해 준다면 가능함(오버로딩)
public Car3() {
// this.name = "이름없음"; // 기본생성자 name값 초기화
// this.number = 0; // 기본생성자 number값 초기화
// 그러나 아래의 메소드와 이 메소드와 this.name과 this.number가 중복임
// 그걸 해결 하기 위한 방법이 존재
this("이름없음", 0); // 이렇게 사용하면 나의 생성자를 의미
// 위에 처럼 적는다면 아래에 있는 생성자가 호출됨
}
public Car3(String name, int number) {
this.name = name;
this.number = number;
}
}
public class CarExam3 {
public static void main(String[] args) {
Car3 c1 = new Car3("소방차");
Car3 c2 = new Car3(); // 기본생성자로 생성
Car3 c3 = new Car3("구급차", 1111);
}
}
5. 패키지
패키지(Package)
서로 관련이 있는 클래스, 인터페이스들의 묶음
클래스들이 필요할때만 사용 될 수 있도록 하며, 클래스를 패키지 이름과 함께 계층적 형태로 사용함으로써 다른 그룹에 속한 클래스와 발생할 수 있는 클래스 이름간의 충돌을 막아줌으로써 클래스 관리를 편리하게 함
클래스 정의 방법
- package이름은 보통 도메인 이름을 거꾸로 적은 후, 그 뒤에 프로젝트 이름을 붙여 만들며 물론 프로젝트 이름 뒤에 또 다른 이름이 나올 수 있음
- 폴더명.폴더명.폴더명과 같은 형식으로 만들어 지며, 폴더명은 숫자로 시작할 수 없음
- 도메인으로 사용하는 이유는 중복 방지로써 반드시 존재하는 도메인이 아니라도 상관 없음
패키지 생성 방법
- 소스폴더 선택 후 우측버튼을 클릭하여 패키지 생성 버튼 선택
- 패키지 이름 작성
- 클래스 생성
- 클래스 내에 맨 윗줄에 package 패키지명;이 생성됨
패키지에 생성된 클래스 사용
- java.lang패키지를 제외하고 다른 패키지에 있는 클래스를 사용하려면 import 구문이 필요함
- 클래스 이름 대신 *(패키지 내 모든 클래스 선택)을 사용해도 됨.
import하지 않고 사용하는 방법
- import를 사용하지 않고 클래스를 사용하려면 '패키지명.클래스명' 형태로 적어줘야함.
※ 출처
Comments