1. 생성자
new 라는 연산자 다음에는 반드시 생성자가 나와야함.
ex) Class c1 = new Class()
여기서 Class() 이게 생성자
public class 클래스명 {
타입 필드명;
public 클래스명 (매개변수 목록){
// 이 블록이 생성자 블록
}
public 리턴타입 메소드명 (매개변수 목록){
}
}
생성자의 특징
- 생성자는 리턴타입이 없다.
- 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.
- 매개변수가 없는 생성자를 기본생성자라고 한다.
- 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어지지 않는다.
생성자의 역할
- 생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.
- 자동차가 객체가 될때 반드시 이름을 가지도록 하려면,Car클래스를 다음과 같이 만들어야 한다.
public class Car{
String name;
int number;
public Car(String n){
name = n;
}
}
- 위의 Car 클래스를 이용하여 Car 인스턴스를 생성하는 방법
public class CarExam2{
public static void main(String args[]){
Car c1 = new Car("소방차");
Car c2 = new Car("구급차");
//Car c3 = new Car(); // 컴파일 오류가 발생
System.out.println(c1.name);
System.out.println(c2.name);
}
}
- Car클래스는 기본 생성자를 가지지 않는다. 그래서 기본생성자로 Car 객체를 생성할 수 없다.
2. This
this는 현재 객체, 자기 자신을 나타냄
== this 는 객체 자신을 참조하는 키워드.
this의 사용
public class Car{
String name;
int number;
public Car(String n){
name = n;
}
}
- Car클래스의 생성자 매개변수의 이름이 n 이다. n 이라는 변수명은 무엇을 의미하는지 쉽기 알수 없다.
- n 으로 쓰기 보다는 name 으로 사용하는 것이 좋다.
public Car(String name){
name = name;
}
- 'name=name' 이라고 코드를 바꾸면, 가깝게 선언된 변수를 우선 사용하기 때문에
- 'name=name'이라는 코드는 매개변수의 name의 값을 매개변수 name에 대입하라는 의미가 된다.
- 즉, 필드는 바뀌지 않. 이런 경우 필드라는 것을 컴파일러와 JVM에게 알려주기 위해서 this키워드를 사용해야 한다.
public Car(String name){
this.name = name;
}
- 앞의 this.name은 필드 name을 말하고 =(이퀄) 뒤의 name은 매개변수를 의미한다.
- 즉 매개변수의 값을 필드에 대입하라는 의미가 된다.
클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다.
3. 메소드 오버로딩
매개변수의 수와 타입이 다른 경우 동일한 이름으로 메소드를 여러개 정의할 수 있음.
== 매개변수의 유형과 개수가 다르게 하여 같은 이름의 메소드를 여러 개 가질 수 있게하는 기술
| 세개 모두 매개변수를 받고 그걸 더해서 return을 하는 기능이니 같은 이름으로 메소드를 만들 수 있음. | ||
![]() |
![]() |
![]() |
| public int plus(int x, int y){ return x+y; } |
public int plus(int x, int y, int z){ return x + y + z; } |
public String plus(String x, String y){ return x + y; } |
메소드 오버로딩은 매개변수 부분이 달라야 함
public int plus(int x, int y){
return x+y;
}
// 이미 이렇게 메소드가 있을 떄
public int plus(int i, int f){
return i+f;
}
// 이렇게 변수명은 다르지만, 매개변수의 타입과 개수가 동일한 메소드를 또 정의 할 수는 없다.
- 위처럼 변수명은 다르지만, 매개변수의 타입과 개수가 동일한 메소드를 또 정의 할 수는 없다.
오버로딩된 메소드 이용하기
- 메소드의 인자에 어떤 값이 쓰이느냐에 따라서 각기 다른 메소드가 호출된다.
public MethodOverloadExam{
public static void main(String args[]){
MyClass2 m = new MyClass2();
System.out.println(m.plus(5,10));
System.out.println(m.plus(5,10,15));
System.out.println(m.plus("hello" + " world"));
}
}
4. 생성자 오버로딩과 this
생성자도 매소드와 마찬가지로 매개변수와 타입이 다르다면 여러개의 생성자를 선언할 수 있음.
== 매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.
public class Car{
String name;
int number;
public Car(){
}
public Car(String name){
this.name = name;
}
public Car(String name, int number){
this.name = name;
this.number = number;
}
}
오버로딩된 생성자 이용하기
public class CarExam4{
public static void main(String args[]){
Car c1 = new Car();
Car c2 = new Car("소방차");
Car c3 = new Car("구급차", 1234);
}
}
자기 생성자 호출하는 this()
기본생성자를 호출하였을 때 name을 "이름없음" , 숫자를 0으로 초기화 하려면?
public Car(){
this.name = "이름없음";
this.number = 0;
// 이렇게 할 경우 코드를 중복해서 쓰니까
this("이름없음", 0);
// 이 방법이 보다 효율적임
// 이건 내가 만들어둔 생성자를 호출하는 것
}
- this괄호 열고로 시작하면 자신의 생성자를 호출하는 것이다.
- 자기 자신의 생성자를 호출함으로써 비슷한 코드가 중복되서 나오는 것을 방지할 수 있다.
5. 패키지
클래스 관리를 위해 사용할 수 있음.
패키지(package) : 서로 관련이 있는 클래스 또는 인터페이스들을 묶어놓은 묶음.
패키지를 사용하면 클래스들이 필요할 떄만 사용될 수 있도록하고, 클래스를 패키지 이름과 함께 계층적인 형태로 사용함으로써 다른 그룹에 속한 클래스와 발생할 수 있는 클래스 이름 간의 충돌을 막아줘 클래스의 관리를 편하게 해준다.
패키지 정의방법
package 패키지이름;
public class 클래스명{
//내용
}
// package 이름은 대부분 도메인 이름을 거꾸로 적은 후 프로젝트 이름을 붙여 사용함.
// 패키지가 있는 클래스를 사용할 떄는 inport 사용함
- package이름은 폴더명.폴더명.폴더명 과 같은 형식으로 만들어진다.
- 각각의 폴더명은 숫자로 시작할 수 없다.
- 도메인 이름이 8cruz.com 이고 프로젝트 이름이 javastudy 라면 com.eightcruz.javastudy.Hello 로 패키지를 지정 할 수 있다.
- 도메인이 숫자로 시작되는데 패키지명은 첫글자에 숫자를 사용할 수 없으므로 적절하게 수정한다.
- 도메인으로 사용하는 이유는 패키지가 중복되는것을 방지하기 위함이므로, 반드시 존재하는 도메인이 아니라도 상관없다.
이클립스에서 패키지 생성하기
- 소스폴더를 선택한 후 우측버튼을 클릭하여 패키지 생성을 선택한다.
- 패키지 이름에 kr.co.helloWorld.javastudy를 입력한다.
- 해당 패키지를 선택하고 Hello클래스를 작성한다.
- 작성된 클래스 파일의 첫줄에 package com.eightcruz.javastudy.Hello; 생성된것을 볼 수 있다.
- 패키지를 생성하는 예약어는 package 다.
패키지에 생성된 클래스 사용하기
- java.lang패키지를 제외하고는 다른 패키지에 있는 클래스를사용하려면 import라는 구문을 적어줘야 한다.
- ctrl+shift+o (import 단축키)
- import com.eightcruz.javastudy.Hello;
- 위의 코드는 com.eightcruz.javastudy패키지 아래의 Hello클래스를 사용하겠다는 것을 컴파일러와 JVM에게 알리는 것이다.
- 클래스 이름대신에 * 를 적어도 된다. import com.eightcruz.javastudy.*;
import 하지 않고 사용하는 방법
- 만약 import를 하기 싫다면, 혹은 각기 다른 패키지에 존재하는 같은 이름의 클래스 파일을 사용해야 한다면 아래와 같이 이용한다.
- com.eightcruz.javastudy.Hello hello = newe com.eightcruz.javastudy.Hello(); 이렇게 사용한다.
'Java > 기초 공부' 카테고리의 다른 글
| 상속(2) - 부모생성자, 오버라이딩, 클래스 형변환 (0) | 2025.11.20 |
|---|---|
| 상속(1) - 상속, 접근제한자, 추상클래스 (0) | 2025.11.20 |
| 클래스와 객체(2) (0) | 2025.11.20 |
| 클래스와 객체(1) (0) | 2025.11.19 |
| 배열 (0) | 2025.11.18 |


