객체와 클래스, 인스턴스의 관계는 붕어빵과도 같다.
객체를 만들기 위해서는 클래스가 필요하고, 클래스를 통해 인스턴스를 여러개 만들 수 있다.
1. 객체 생성
클래스 변수 = new 클래스();
객체를 생성하기 위해서는 new연산자가 필요하다.
이 때 new 연산자는 객체의 주소값을 리턴한다.
//Student라는 클래스가 있다고 가정하자
Student student = new Student();
힙 영역에 Student 객체가 만들어지고, 스택 영역에 만들어진 student 변수에는 Student 인스턴스의 주소값이 들어간다.
2. 클래스의 구성
public class FishBread{
//필드
String taste;
int price;
//생성자
FishBread(){ }
//메소드
void makeFishBread(){ }
}
3. 필드
: 인스턴스 필드와 공유 필드가 있다.
인스턴스 필드는 해당 객체만 접근할 수 있고, 공유 필드는 클래스로 접근할 수 있다. 이는 모든 인스턴스가 같은 값을 사용하게 된다. 붕어빵의 총 개수를 알고싶을 때...사용하며, static을 붙여준다.
public class FishBread{
String taste;
int price;
static int total;
//default 생성자
FishBread(){
//인스턴스가 생성될 때마다 증가하며, 모든 인스턴스가 같은 total을 공유한다.
total++;
}
}
...
//클래스로 호출할 수 있다.
FishBread fishBread = new FishBread();
FishBread.total;
4. 생성자
new 연산자는 객체를 생성한 후 생성자를 호출해 객체를 초기화한다.
기본 생성자
: 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 자동으로 생성한다.
생성자 오버로딩
: 매개변수를 다르게하여 생성자를 선언하는 것이다.
//다음과 같이 생성자를 호출할 때 매개값을 전달할 경우
FishBread fishBread = new fishBread("슈크림", 500);
...
public class FishBread{
String taste;
int price;
static total;
//생성자를 통해 초기화를 진행할 수 있다.
FishBread(String taste, int price){
//this는 호출한 객체를 말한다.
//호출한 객체의 taste에 "슈크림"을 넣는 것이다.
this.taste = taste;
this.price = price;
total++;
}
}
생성자 오버로딩은 여러개 가능하다. 이때 같은 형태의 매개변수는 사용할 수 없다.
public class FishBread{
String taste;
int price;
static total;
FishBread(){
taste = "팥;
price = 600;
total++;
}
FishBread(String taste){
this.taste = taste;
total++;
}
FishBread(String taste, int price){
this.taste = taste;
this.price = price;
total++;
}
}
위와 같이 생성자가 여러개일 경우 중복되는 값이 있을것이다. 추후 유지보수를 위해 다음과 같이 this()를 사용해 자신의 생성자를 호출하면 중복을 방지할 수 있다.
public class FishBread{
String taste;
int price;
static int total;
FishBread(){
//최상단에 작성해야 한다.
this("팥",600);
}
FishBread(String taste){
this(taste, null);
}
FishBread(String taste, int price){
this.taste = taste;
this.price = price;
total++;
}
}
5. 메소드 선언과 호출
리턴타입 메소드명 ( 매개변수 ){ };
public class FishBread{
String taste;
int price;
void complite(){
System.Out.println(taste + "맛 붕어빵 완성");
}
}
FishBread fishBread = new FishBread("슈크림", 300);
fishBread.complite();
이때 public이 붙으면 다른 패키지에서도 호출이 가능하다. 위와같이 생략되어 있다면, 같은 패키지 내에서만 호출이 가능하다.