private
: 변수를 외부에서 직접 처리 못하도록 하는 방법getName()
,setName()
new 생성자();
new 클래스이름()
-> 생성자가 없으면 호출이 안됨.Car car = new Car();
public class Student {
}
public class StudentExample {
public static void main(String[] args) {
// 참조형 변수 - 주소로 운영
// new Student() -> 생성자를 이용해서 생성한다. 주소를 s1에 저장한다.
Student s1 = new Student();
System.out.println("s1 변수에 Student 객체를 생성해서 저장합니다.");
System.out.println("s1의 hashcode 값 : " + s1); // s21의 toString() 호출해서 문자열로 만든다음 출력한다.
System.out.println("s1의 identityHashCode 값 : " + System.identityHashCode(s1) + "\n");
// new Student() -> 생성자를 이용해서 생성한다. 주소를 s2에 저장한다.
Student s2 = new Student();
System.out.println("s2 변수에 또 다른 Student 객체를 생성해서 저장합니다.");
System.out.println("s2의 hashcode 값 : " + s2.toString());
System.out.println("s2의 identityHashCode 값 : " + System.identityHashCode(s2) + "\n");
// 주소값이 같은지 확인
if(s1 == s2) {
System.out.println("s1과 s2의 주소는 같다.");
} else {
System.out.println("s1과 s2의 주소는 같지 않다.");
}
}
}
// 데이터를 저장하는 용도로 작성된 클래스
// 저장 - VO : CarVO, 전달 - DTO : CarDTO, 객체의 정보 : Car
public class Car {
// static이 없어서 자동으로 올라가지 않고 new를 통해 객체를 생성해야 올라간다.
// 회사, 모델, 색상, 최고 속도, 현재 속도
String company = "현대자동차";
String model = "그랜저";
String color = "검정";
int maxSpeed = 350;
int speed;
// new Car()
public Car() {} // 생성자가 없을 때 컴파일러가 만들어 주는 기본 생성자
// 똑같은 이름인데 전달되는 변수 갯수나 타입에 따라서 구분이 된다.
// new Car("기아","모하비", "블랙", "200", "0")
public Car(String company, String model, String color, int maxSpeed, int speed) {
this.company = company;
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
this.speed = speed;
}
}
public class CarExample {
//시작
public static void main(String[] args) {
// Car() 생성자를 이용해서 객체를 생성한다(new). 주소가 나온다. 주소를 myCar에 저장한다.
// 생성자가 없으면 기본 생성자를 만들고 컴파일 해준다.
Car myCar = new Car(); // 생성자 없는 객체를 생성, 이미 값이 들어가 있어서 기본적으로 생성이 되어있음. (생략되어 있음)
Car myCar1 = new Car("기아", "모하비", "블랙", 200, 0); // 생성자 있는 객체 생성해서 값을 넣어줌
// 필드(변수)값을 읽기
System.out.println("제작회사 : " + myCar.company);
System.out.println("모델명 : " + myCar.model);
System.out.println("색깔 : " + myCar.color);
System.out.println("최고속도 : " + myCar.maxSpeed);
System.out.println("현재속도 : " + myCar.speed);
System.out.println();
System.out.println("제작회사 : " + myCar1.company);
System.out.println("모델명 : " + myCar1.model);
System.out.println("색깔 : " + myCar1.color);
System.out.println("최고속도 : " + myCar1.maxSpeed);
System.out.println("현재속도 : " + myCar1.speed);
System.out.println();
// 변경된 값
myCar.speed = 60;
System.out.println("수정된 속도 : " + myCar.speed);
}
}
생성자가 없을 때는 컴파일러가
public Car()
라고 기본 생성자를 생성 해 줘서 굳이 생성자를 만들 필요는 없다. 하지만 인자가 있는 생성자를 하나 더 만든다면 (public Car(String company, String model, String color, int maxSpeed, int speed)
) 메인 메서드에서Car myCar = new Car()
를 참조할 생성자가 없기 때문에 기본 생성자도 생성을 해 줘야 한다.
public class Car {
String company = "현대자동차";
String model = "그랜저";
String color = "검정";
int maxSpeed = 350;
int speed;
public Car() {
}
public Car(String company, String model, String color, int maxSpeed, int speed) {
this.company = company;
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
this.speed = speed;
}
// 어노테이션 : 오버라이딩을 올바르게 했는지 컴파일러가 체크한다.
// 부모클래스(Object)에서 상속받은 것과 동일한지 체크하는 역할을 한다.
@Override
// Object에 객체 출력하는 메서드 => toString(){~~} --> Override라고 한다.
// toString() : 객체의 정보를 문자열로 만든다. 주로 객체 안에 있는 데이터를 확인하기 위해서
public String toString() { // 형태가 Object 클래스 안에 있는 것과 같아야 한다.
return "Car[company = " + company + ", model = " + model + ", color = " + color
+ ", maxSpeed = " + maxSpeed + ", speed = " + speed + "]";
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
Car myCar1 = new Car("기아", "모하비", "블랙", 200, 0);
System.out.println(myCar); // public String toString() 호출
}
}
- 단순히 데이터를 확인 하기 위해서 Object 클래스에 있는
public String toString()
객체를 생성한다. Object에서 상속받은것이기 때문에 오버라이딩이 이루어졌다. 오버라이딩이 제대로 됐는지 (오탈자는 없는지 등) 확인하기 위헤@Override
를 사용 하면 알 수 있다.Annotation
은 오버라이딩을 올바르게 했는지 컴파일러가 체크하는 역할을 한다.- 메인 메서드에서
System.out.println(myCar);
을 출력하면 Car class에서 선언된public String toString()
의 리턴값을 출력한다.
=> Car[company = 현대자동차, model = 그랜저, color = 검정, maxSpeed = 350, speed = 0]
private String name;
에 대한 getter setter 메소드 만들기
getterpublic String getName() { return name; }
setterpublic void setName (String name) { this.name = name; }
public class Car {
// public - 다른 패키지에서 사용 가능
// private - Car Class 안에서만 사용 가능
private String company = "현대자동차";
private String model = "그랜저";
private String color = "검정";
private int maxSpeed = 350;
private int speed;
// new Car()
public Car() {
}
public Car(String company, String model, String color, int maxSpeed, int speed) {
this.company = company;
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
this.speed = speed;
}
// getter와 setter
// company 데이터 가져가는 메서드 - 다른 위치에서도 사용 가능하다.
public String getCompany() {
return company;
}
// company 데이터 넣어주는 메서드 - 다른 위치에서도 사용 가능하다.
public void setCompany(String company) {
this.company = company;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
Car myCar1 = new Car("기아", "모하비", "블랙", 200, 0);
// 필드(변수)값을 읽기
System.out.println("제작회사 : " + myCar.getCompany());
System.out.println("모델명 : " + myCar.getModel());
System.out.println("색깔 : " + myCar.getColor());
System.out.println("최고속도 : " + myCar.getMaxSpeed());
System.out.println("현재속도 : " + myCar.getSpeed());
System.out.println("제작회사 : " + myCar1.getCompany());
System.out.println("모델명 : " + myCar1.getModel());
System.out.println("색깔 : " + myCar1.getColor());
System.out.println("최고속도 : " + myCar1.getMaxSpeed());
System.out.println("현재속도 : " + myCar1.getSpeed());
myCar.setCompany("기아");
System.out.println("수정된 회사 : " + myCar.getCompany());
}
}
getter메서드는 데이터를 읽어올 수 있게 해주고, setter 메서드는 데이터를 넣을 수 있게 (수정할 수 있게) 해준다. public을 사용하지 않고 굳이 private를 줘서 getter와 setter 메서드를 사용하는 이유가 몇가지 있는데 블로그 링크를 걸어놓고 나중에 따로 정리 해야겠다.
getter와 setter 사용하는 이유 - 블로그 링크