public class User {
private String name;
private int age;
// 생성자
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 생성자
public User(int age) {
this.age = age;
}
// 출력 메소드
public void print() {
System.out.println("이름은 : " + name + " " + "나이는 :" + age);
}
public static void main(String[] args) {
User user1 = new User("신재원", 25);
user1.print();
User user2 = new User(30);
user2.print();
}
}
출력
이름은 : 신재원 나이는 :25
이름은 : null 나이는 :30
private String name; : 멤버 변수로 private 으로 선언하면, 외부에서는 직접적으로 접근이 불가능하므로, 클래스 내부에서만 사용할 수 있습니다.
getter 와 setter 를 통해 제어함으로써 캡슐화에 부합한다는 것입니다. // 생성자
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 생성자
public User(int age) {
this.name = "";
this.age = age;
}
❗ 클래스에 생성자가 하나도 없는경우에는 컴파일러가 자동으로 기본 생성자를 생성
( 생성자가 하나라도 있으면, 자동으로 생성 XX )
// 생성자
public User(String name, int age) {
this.name = name;
age = age;
}
// 생성자
public User(String name, int userAge) {
this.name = name;
age = userAge;
}
this 는 클래스를 가르킵니다. (멤버 변수)📍 파라미터 이름과 멤버 변수의 이름을 같지 않게 사용할수도있습니다.
(하지만 대체로 생성자에서 파라미터랑 멤버변수의 이름을 같게 사용합니다)
this 를 써서 접근하는걸 권장합니다.public void initData(String name, int age){
this.name = name;
this.age = age;
}
public static void main(String[] args) {
User user = new User();
user.initData("신재원", 25); // 필드 초기화
}
- 위 코드에서 initData의 필드를 초기화 하기 위해서는 생성자와 다르게 한번을 호출하여 값을 할당 해줘야 합니다.
❗❗ 생성자를 사용하면은 메소드를 정의하지않고, 초기화를 할수있습니다.
스태틱 ( Static ) 메소드 ( Method )는 일반 메소드와 달리 객체의 생성없이 호출하여 사용 할수 있다는 것입니다.
public class Main {
public static void printHello() {
System.out.println("Hello!");
}
public static void main(String[] args) {
printHello(); // 객체 생성없이 접근 가능
}
}
자바에서 지원하는 Math.min(), Math.max() 같이 지원하는 스태틱 메소드도 있습니다.
public abstract class Unit {
public abstract void attack();
public class Marine extends Unit {
@Override
public void attack() {
System.out.println("소총으로 공격합니다.");
}
}
public class Firebat extends Unit {
@Override
public void attack() {
System.out.println("화염방사기로 공격합니다.");
}
}
public static void main(String[] args) {
Marine marine = new Marine();
marine.attack();
}
}
메소드 분리, 생성자를 추가하는 시점
- 설계를 잘하면 좋지만, 설계를 완벽하게 하는것은 불가능에 가깝습니다.
- 요구사항이 나오면 그때 리팩토링을 수행합니다.
(중복되는 코드를 분리)
자바의 OOP로 나아가는 과정
실무에서는 추상 클래스와 상속을 생각보다 잘 쓰기가 힘듭니다.
(extends, super 등)
상속은 잘 안쓰는 반면, 인터페이스는 많이 사용합니다.
✔ 제어의 역전