객체 지향 언어
현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며 발생하는 모든 사건들은 객체 간의 상호작용이다.
이 세계관을 프로그래밍 언어에 도입하여 만들어진 언어가 객체 지향 언어이다.
카페에 있는 객체 손님, 캐셔, 바리스타
손님: 주문 하는 행위, 결제, 받고 나가는 역할
캐셔 : 주문 받기, 결제, 바리스타 주문전달
손님과 바리스타와 상호작용을 해야함
객체 사이의 메시지를 통해 상호작용
메시지 = 메소드
홍반장 : 동네일을 다 처리함
객체입장에서는 안좋음
메소드의 명칭은 동사형태
변수는 명사형 소문자로
김춘수 꽃
내가 그의 이름을 불러 주었을 때
그는 나에게로 와서
꽃이 되었다.
호출해야 heap공간에 생성됨
new라는 연산자를 써야 heap 공간에 생성되어
car 클래스에서 가져와 객체를 사용할 수 있음
필드변수에 private 붙인 이유는
외부에서 접근을 막아주기 위한 용도로
CarRacer에서만 고정해서 쓰겠다.
그리고 메소드를 통해서만 접근해라
application
package com.greedy.section03.abstraction;
import java.util.Scanner;
public class Application {
public static void main(String[] args) {
/*
* 객체 지향 프로그래밍
* 현실세계의 모든 사건(event)은 객체와 객체의 상호작용에 의해 일어난다는 세계관을
* 프로그램을 만들 때 이용하여 새로운 세계를 창조하는 방법론이다.
*
* 현실세계와 닮았지만 현실 세계와 다른 점은,
* 객체간의 상호작용을 한다는 사실은 현실 세계와 동일하지만 의인화기법이 적용되어
* 현실세계에서 불가능한 무생물이나 개념 같은 존재들도 하나의 주제로
* 본인의 상태를 스스로 제어하고 행동하도록 한다는 것이 현실 세계와는 다른 점이다.(<-캡슐화의의미)
*
* 모든 객체는 책임을 가지고 자신의 역할을 수행한다는 의미이다.
* 또한 하나의 객체는 너무 많은 일을 수행하는 것이 아닌 적절한 책임을 가지고 있어야 한다.
* */
/* 추상화란?
*
* 공통된 부분을 추출하고 공통되지 않는 부분을 제거한다는 의미를 가지며, 추상화의 목적은
* 유연성을 확보하기 위함이다.
* */
/* 카레이서가 자동차를 운전하는 프로그램을 만들려고 한다. */
/*
* 1. 자동차는 처음에 멈춘 상태로 대기하고 있는다.
* 2. 카레이서는 먼저 자동차에 시동을 건다. 이미 걸려있는 경우 다시 시동을 켤 수 없다.
* 3. 카레이서는 엑셀레이터를 밟으면 시동이 걸린 상태일 경우 자동차는 시속이 18km/h 증가하며 앞으로 나간다.
* 4. 자동차가 달리는 중인 경우 브레이크를 밟으면 자동차의 시속은 0으로 떨어지며 멈춘다.
* 5. 브레이크를 밟을 때 자동차가 달리는 중이 아니라면 이미 멈춰있는 상태라고 안내한다.
* 6. 카레이서가 시동을 끄면 더 이상 자동차는 움직이지 않는다.
* 7. 자동차가 달리는 중이라면 시동을 끌 수 없다.
* */
/*
* 여기서 필요한 객체는 자동차와 카레이서이다.
* 카레이서가 수신할 수 있는 메세지는 카레이서가 해야할 일과 동일하다.
* 1. 시동을 걸어라
* 2. 엑셀레이터를 밟아라
* 3. 브레이크를 밟아라
* 4. 시동을 꺼라
*
* 자동차가 수신할 수 있는 메세지는 자동차가 해야할 일과 동일하다.
* 1. 시동을 걸어라
* 2. 앞으로 가라
* 3. 멈춰라
* 4. 시동을 꺼라
* */
/* 객체와 객체의 상호작용이란?
*
* 객체와 객체는 메세지를 통해 서로 상호작용을 한다. 메세지(메소드 호출)를 보내는 쪽을 송신자라고 하고
* 메세지를 수신하는 쪽을 수신자라고 한다. 수신자는 메시지를 전달 받아 그 메세지에 해당하는 내용을 처리하는 방법을
* 스스로 결정하고, 그 결정한 방법 대로 처리할 명령어들을 순차적으로 기술한 것을 메소드라고 한다.
* */
CarRacer racer = new CarRacer();
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("========카레이싱 프로그램=======");
System.out.println("1. 시동을 걸기");
System.out.println("2. 전진");
System.out.println("3. 정지");
System.out.println("4. 시동끄기");
System.out.println("9. 프로그램 종료");
System.out.print("메뉴 선택 : ");
int no = sc.nextInt();
switch(no) {
case 1 : racer.startUp(); break;
case 2 : racer.stepAccelator(); break;
case 3 : racer.stepBreak(); break;
case 4 : racer.turnOff(); break;
case 9: System.out.println("프로그램을 종료합니다."); break;
default : System.out.println("잘못된 번호를 선택하셨습니다."); break;
}
if(no==9) {
break;
}
}
sc.close();
}
}
package com.greedy.section03.abstraction;
public class Car {
/* 시동을 켜거나 끄거나, 앞으로 가거나 멈추거나 하는 행동은
* 시동이 걸려있는지의 상태를 확인해야 한다.
* 즉 메소드간에 서로 공유해야하는 속성이 존재한다.
* 그것을 필드에 작성할 것이다.
* */
private boolean isOn; // 초기에는 시동이 꺼진 fasle 상태이다.
private int speed; // 속도
/**
* <pre>
* 자동차의 시동을 걸기 위한 메소드
* </pre>
*/
public void startUp() {
if(isOn) {
System.out.println("이미 시동이 걸려 있습니다.");
} else {
this.isOn = true; //this생략 가능
System.out.println("시동을 걸었습니다. 이제 출발할 준비가 완료되었습니다.");
}
}
/**
* <pre>
* 자동차를 가속시키기 위한 메소드
* 시동이 걸린 상태인 경우에만 호출시마다 10km/h씩 속도를 증가시킨다.
* </pre>
*/
public void go() {
if(isOn) {
System.out.println("차가 앞으로 움직입니다.");
this.speed += 10;
System.out.println("현재 차의 시속은 " + this.speed + "km/h 입니댜.");
} else {
System.out.println("차의 시동이 걸려있지 않습니다. 시동을 먼저 걸어주세요.");
}
}
/**
* <pre>
* 자동차를 멈추기 위한 메소드
* 시동이 걸려있고 달리는 상태인 경우에만 멈출 수 있다.
* </pre>
*/
public void stop() {
if(isOn) {
if(this.speed > 0) {
/* 달리고 있는 상태인 경우*/
this.speed = 0;
System.out.println("브레이크를 밟았습니다. 차를 멈춥니다.");
} else {
System.out.println("차는 이미 멈춰있는 상태입니다. ");
}
} else {
System.out.println("차의 시동이 걸려있지 않았습니다. 시동을 먼저 걸어주세요.");
}
}
/**
* <pre>
* 자동차의 시동을 끄기 위한 메소드
* </pre>
*/
public void turnOff() {
if(isOn) {
if(this.speed > 0 ) {
System.out.println("달리는 상태에서 시동을 끌 수 없습니다. 차를 우선 멈춰주세요.");
}else {
this.isOn = false;
System.out.println("시동을 끕니다. 다시 운행하시려면 시동을 켜주세요.");
}
} else {
System.out.println("이미 시동이 꺼져 있는 상태입니다. 시동 상태를 확인해주세요.");
}
}
}
package com.greedy.section03.abstraction;
public class CarRacer {
private Car car = new Car();
/**
* <pre>
* 카레이서가 자동차의 시동을 걸 수 있는 메소드
* </pre>
*/
public void startUp() {
car.startUp();
}
/**
* <pre>
* 카레이서가 엑셀레이터를 밟아 가속을 할 수 있는 메소드
* </pre>
*/
public void stepAccelator() {
car.go();
}
/**
* <pre>
* 카레이서가 브레이크를 밟아 정지할 수 있는 메소드
* </pre>
*/
public void stepBreak() {
car.stop();
}
public void turnOff() {
car.turnOff();
}
}
========카레이싱 프로그램=======
1. 시동을 걸기
2. 전진
3. 정지
4. 시동끄기
9. 프로그램 종료
메뉴 선택 : 1
시동을 걸었습니다. 이제 출발할 준비가 완료되었습니다.
========카레이싱 프로그램=======
1. 시동을 걸기
2. 전진
3. 정지
4. 시동끄기
9. 프로그램 종료
메뉴 선택 : 4
시동을 끕니다. 다시 운행하시려면 시동을 켜주세요.
========카레이싱 프로그램=======
1. 시동을 걸기
2. 전진
3. 정지
4. 시동끄기
9. 프로그램 종료
메뉴 선택 : 9
프로그램을 종료합니다.
캡슐화 결합도를 낮추기 위해 필드의 직접 접근을 제한하고 public 메소드를 사용하여 간접적으로 접근 하게함
데이터의 이동목적으로 만든 클래스->dto
boolean 값이 붙어있으면 앞에 is 붙임!
[표현식]
* public void set필드명 (반환값 필요x)
커맨드 옵션 S
alt shift s -> generate getters and setters -> selct setter public으로 선택 -> generate
public void setActivated -> setter을 만들어줄때 is를 빼고 만들어줌 (boolean isActivated) {
this.isActivated = isActivated;
public boolean isActivated() {
return isActivated;
->getter 에서이번에는 get을 생략
필드 7개 메소드 14개
package com.greedy.section03.dto;
public class Application {
public static void main(String[] args) {
/* 추상화라는 것은 매우 어려운 작업이다.
* 캡슐화의 원칙에는 일부 어긋나긴 하지만 매번 추상화를 하지 안하도 되는 객체도 존재한다.
* 행위 위주가 아닌 데이터를 하나로 뭉치기위한 객체(Data Transfer Object)의 경우이다.
*
* 값 객체를 설계할 때는 행위가 아닌 데이터가 위주이며, 캡슐화의 원칙을 준수하여
* 모든 필드는 private로 직접 접근을 막고, 각 필드값을 변경하거나 반환하는 메소드를 세트로 미리 작성해준다.
*
* private 필드와 필드값을 수정하는 설정자(setter), 필드에 접근하는 접근자(getter)들로 구성된다.
* */
MemberDTO member = new MemberDTO();
member.setNumber(1);
member.setName("홍길동");
member.setAge(20);
member.setGender('남');
member.setHeight(180.5);
member.setWeight(75.0);
member.setActivated(true);
System.out.println("회원번호 : " + member.getNumber());
System.out.println("회원명 : " + member.getName());
System.out.println("나이 : " + member.getAge());
System.out.println("성별 : " + member.getGender());
System.out.println("키 : " + member.getHeight());
System.out.println("몸무게 : " + member.getWeight());
System.out.println("회원활성화상태 : " + member.isActivated());
}
public MemberDTO test(MemberDTO member) {
return member;
}
}
package com.greedy.section03.dto;
public class MemberDTO {
/* 회원이 활 수 있는 행동이 주제가 아닌,
* 관리하려는 회원의 데이터에 집중해서 필드를 설계
* */
/* memberNumber이 필드명이 아니라 number를 선택한 이유는
* 해당 필드에 접근할 때 MemberDTO member = new MemberDTO(); member.number;
* */
private int number; // 회원번호
private String name; // 회원명
private int age; // 나이
private char gender; // 성별
private double height; // 키
private double weight; // 몸무게
private boolean isActivated; // 회원탈퇴여부(활성화여부)
/* 설정자(setter)/ 접근자(getter)의 경우 실무에서 암묵적으로 통용되는 작성 규칙이 존재한다. */
/* 설정자(setter) 작성규칙
* : 필드값을 변경할 목적의 매개변수를 변경하려는 필드와 같은 자료형으로 선언하고
* 호출 당시 전달되는 매개변수의 값을 이용하여 필드의 값을 변경한다.
*
* [표현식]
* public void set필드명(매개변수) {
* this.필드 = 매개변수;
* }
*
* [작성예시]
* public void setName(String name) {
* this.name = name;
* }
*
* 접근자(getter) 작성규칙
* : 필드의 값을 반환받을 목적의 메소드 집합을 의미한다.
* 각 접근자는 하나의 필드에만 접근하도록 한다.
* 필드에 접근해서 기록된 값을 return을 이용하여 반환하며, 이때 반환타입은 반환하려는 값의 자료형과 일치시킨다.
*
* [표현식]
* public 반환형 get필드명() {
* return 반환값;
* }
*
* [작성예시]
* public String getName(){
* return this.name;
* }
* */
public void setNumber(int number) {
this.number = number;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setGender(char gender) {
this.gender = gender;
}
public void setHeight(double height) {
this.height = height;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void setActivated(boolean isActivated) {
this.isActivated = isActivated;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getGender() {
return gender;
}
public double getHeight() {
return height;
}
public double getWeight() {
return weight;
}
/* boolean의 접근자는 get으로 시작하지않고 is로 시작하는 것이 일반적인 관례이다.*/
public boolean isActivated() {
return isActivated;
}
}
-> 회원번호 : 1
회원명 : 홍길동
나이 : 20
성별 : 남
키 : 180.5
몸무게 : 75.0
회원활성화상태 : true
생성자 (constructor)
객체가 new연산자를 통해 heap 메모리영역에 할당될 때 1회성으로 호출되는 리턴 타입이없는 메소드
인스턴스 생성시 필드 초기화 목적으로 주로 사용된다
-생성자 작성규칙
생성자의 선언은 메소드 선언과 유사하지만 반환값이 없음
생성자명을 클래스명과 동일해야함
괄호를 열고닫는건 모두 메소드
jvm이 heap공간에 빈값을 채워주는것
MemberDTO member = new MemberDTO();
ㄴ 주소값
member.id
new는 heap이라는 공간에 할당하겠다
같은 타입이어야한다.
대입연산자 = 기준으로 양쪽 모두 타입이 같아야 한다.
Monster monster1 = new Monster();
Monster은 둘다 problem1 클래스의 몬스터 타입이다
오버로딩 면접질문으로 자주나옴
기본생성자와 매개변수생성자의 차이
둘다 똑같이 인스턴스 객체를 만드는건 같다
기본생성자는 필드의 초기값을 변수에 지정되어있는 타입의 기본값으로 생성할거냐/ 그리고 나중ㅇ에
package com.greedy.section04.constructor;
public class Application {
public static void main(String[] args) {
/*
* 클래스명 레퍼런스변수(참조변수) = new 클래스명(); --> 이렇게 객체를 생성한다.
* 하지만 new뒤에 클래스명은 사실 생성자(Constructor)라 불리는 메소드를
* 호출하는 구문이다.
*
* 클래스명(자료형) 레퍼런스변수 = new 생성자();라 표현하는게 맞다.
*
* */
/*
* 생성자란?
* 인스턴스(instance)를 생성할 때 초기 수행할 명령이 있는 경우 미리 작성해두고, 인스턴스를
* 생성할 때 호출한다.
* 생성자 함수에 매개변수가 없는 생성자을 기본생성자(default constructor)라고 하며
* 기본생성자는 Compiler에 의해 자동으로 추가되기 때문에 지금까지 명시적으로 작성하지 않고 사용할 수 있었다.
* (즉, 인스턴스 생성 시 별도로 수행할 명령이 없었기 때문에 아무것도 작성하지 않은 것이다.)
*
* 이렇게 기본생성자를 이용해서 인스턴스를 생성하게되면 자바에서는 자료형별 초기값을 이용해 필드를 초기화한다.
* 필드의 초기값을 사용자가 원하는대로 설정하고 싶은 경우 생성자의 호출 시 인자로 값을 전달하여 호출할 수 있다.
* 하지만 매개변수 있는 생성자가 한 개라도 존재하는 경우 Compiler는 기본생성자를 자동으로 추가해주지 않으니
* 사용시 주의해야 한다.
*
* 매개변수 있는 생성자는 주로 인스턴스 생성 시점에 필드의 값을 사용자가 원하는대로 초기화할 목적으로 사용한다.
* */
User user1 = new User();
System.out.println(user1.getInformation());
User user2 = new User("user01", "pass01", "홍길동");
System.out.println(user2.getInformation());
User user3 = new User("user02", "pass02", "이순신", new java.util.Date());
System.out.println(user3.getInformation());
User user4 = new User(user3);
System.out.println(user4.getInformation());
}
}
package com.greedy.section04.constructor;
import java.util.Date;
public class User {
private String id;
private String pwd;
private String name;
private Date enrollDate; // 필드로 다른 클래스 자료형도 사용할 수 있다.
/*
* 생성자의 작성위치
* 작성위치는 문법상으로 클래스 내부에 작성하면 되지만,
* 통사적으로 필드선언부와 메소드선언부 사이에 작성하는것이 관례이다.
* */
/* 생성자의 사용 목적
* 1. 인스턴스 생성 시점에 수행할 명령이 있는 경우 사용한다.
* 2. 매개변수 있는 생성자의 경우 매개변수로 전달받은 값으로 필드를 초기화하며 인스턴스를 생성할 목적으로 주로 사용한다.
* 3. 작성한 생성자 외에는 인스턴스를 생성하는 방법을 제공하지 않겠다는 의미를 가진다.
* 따라서, 인스턴스를 생성하는 방법을 제한하기 위한 용도로 사용할 수 도 있다.(초기값 전달 강제화)
*
* */
/*
* 생성자 작성 방법
* [표현식]
* 접근제한자 클래스명(매개변수) {
* 인스턴스 생성 시점에 수행할 명령 기술(주로 필드를 초기화)
* this.필드명 = 매개변수;
* }
*
* 생성자 작성 방법은 메소드를 작성하는 방법과 유사하다. 하지만 두 가지 사항을 조심해야한다.
* 1. 생성자메소드는 반드시 클래스의 이름과 동일해야한다.(대/소문자까기 같아야한다.)
* 2. 생성자 메소드는 반환형을 작성하지 않는다.(작성하는 경우 생성자가 아닌 메소드로 인식한다.)
* */
/* 기본생성자(default constructor) */
public User() {
System.out.println("User 클래스의 기본 생성자 호출함...");
}
// public User() {} // 동일한 이름의 생성자 혹은 메소드를 한 클래스 안에서 작성하는 것은 불가능하다(Compile Error)
/* 매개변수 있는 생성자
* 초기화할 필드가 여러 개인 경우, 초기화하고 싶은 필드의 갯수별로 생성자를 여러개 준비할 수 있다.
* */
public User(String id, String pwd, String name) {
/* 분명 동일한 이름의 생성자는 작성하지 못한다고했는데 작성을 했다.
*
* 이는 매개변수 선언부에 작성한 매개변수의 타입, 갯수, 순서에 따라 동일한 생성자 혹은 메소드를
* 한 클래스 내에 여러 개 작성할 수 있게 만든 기술이다(오버로딩)
*
* */
this.id = id;
this.pwd = pwd;
this.name = name;
System.out.println("User 클래스의 id, pwd, name을 초기화하는 생성자 호출함...");
}
public User(String id, String pwd, String name, Date enrollDate) {
/* this()메소드는 중복되는 초기화 내용이 발생되면 이 중복된 내용을 줄여서 작성할 수 있다.
* 동일한 클래스 내에 작성한 다른 생성자 메소드를 호출하는 것이고, 괄호안에 매개변수의
* 타입, 갯수, 순서에 맞는 생성자를 호출하고 복귀한다.
*
* 리턴되어 돌아오지만 리턴값은 존재하지 않는다.
* this()는 가장 첫줄에 선언해야 하며, 그렇지 않은 경우 Compile Error가 발생한다.
* */
// this.id = id;
// this.pwd = pwd;
// this.name = name;
this(id, pwd, name);
this.enrollDate = enrollDate;
System.out.println("User 클래스의 모든 필드를 초기화하는 생성자 호출함...");
}
public User(User otherUser) {
this.id = otherUser.id;
this.pwd = otherUser.pwd;
this.name = otherUser.name;
this.enrollDate = otherUser.enrollDate;
System.out.println("User 클래스의 복사생성자 호출함...");
System.out.println("this의 hashCode : " + this.hashCode());
System.out.println("otherUSer의 hashCode : " + otherUser.hashCode());
}
/**
* <pre>
* 모든 필드가 가지고 있는 값을 문자열로 합치기하여 반환하는 메소드
* </pre>
* @return 모든 필드값을 문자열 합치기한 문자열
*/
public String getInformation() {
return "User id = " + this.id + ", pwd =" + this.pwd + ", name="
+ this.name + ",enrollDate= " + this.enrollDate;
}
}
User 클래스의 기본 생성자 호출함...
User id = null, pwd =null, name=null,enrollDate= null
User 클래스의 id, pwd, name을 초기화하는 생성자 호출함...
User id = user01, pwd =pass01, name=홍길동,enrollDate= null
User 클래스의 id, pwd, name을 초기화하는 생성자 호출함...
User 클래스의 모든 필드를 초기화하는 생성자 호출함...
User id = user02, pwd =pass02, name=이순신,enrollDate= Tue Oct 18 15:34:31 KST 2022
User 클래스의 복사생성자 호출함...
this의 hashCode : 1012570586
otherUSer의 hashCode : 1207140081
User id = user02, pwd =pass02, name=이순신,enrollDate= Tue Oct 18 15:34:31 KST 2022
alt shift s -> generate constructor superclass -> generate
alt shift s -> generate constructor using fields -> generate
sauce ->에 들어가서도 가능
public UserDTO() {
} -> 기본생성자
public UserDTO(String id, String pwd, String name, String enrollDate) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.enrollDate = enrollDate;
package com.greedy.section05.overloading;
public class OverloadingTest {
/*
* 오버로딩의 사용 이유
*
* 매개벼변수의 종류별로 메소드 내용을 다르게 작성해야 하는 경우들이 종종 있다.
* 이 때, 동일한 기능의 메소드를 매개변수에 따라 다르게 이름을 정의하면 복잡하고 관리하기가 매우 어려울 것이다.
* 규모가 작은 프로그램의 경우는 정도가 덜하지만, 규모가 거대해지면 메소드 또한 관리하기가 매우 어려워진다.
* 따라서 동일한 이름으로 다양한 종류의 매개변수에 따라 처리해야 하는 여러 메소드를 동일한 이름으로 관리하기
* 위해 사용하는 기술을 오버로딩이라고 한다.
*
*
* 오버로딩의 조건
* 동일한 이름을 가진 메소드의 파라미터 선언부에 매개변수의 타입, 갯수, 순서를 다르게 작성하여
* 한 클래스 내에서 동일한 이름의 메소드를 여러 개 작성할 수 있도록 한다.
*
* 메소드의 시그니처(signature)가 다르면 다른 메소드로 인식하기 때문이다.
* 즉, 시그니쳐 중 메소드 이름은 동일해야 하기 때문에 파라미터 선언부가 다르게 작성되어야 오버로딩이 성립된다.
*
* 메소드의 시그니쳐?
* public void method(int num) {}이라는 메소드의 메소드명과 파라미터 선언부 부분을 시그니쳐라고 부른다.
*
* method(int num) <-------- 이 부분이 시그니쳐이다.
*
* 메소드의 시그니쳐가 달라야 하기 때문에 접근제한자나 반환형은 오버로딩 성립요건에 해당하지 않는다.
*
* */
public void test() {}
/* 메소드의 시그니처가 동일한 경우 Compile Error를 발생시킨다.*/
// public void test() {}
/* 접근제한자에 따른 오버로딩 성립 확인 */
// private void test() {} // 에러남 -> 접근제한자는 메소드 시그니처에 해당하지 않는다.
/* 반환형에 따른 오버로딩 성립 확인*/
// public int test() { // 에러남 -> 반환형은 메소드 시그니처에 해당하지 않는다.
//
// return 0;
// }
/ 매개변수 유무에 따른 오버로딩 성립확인/
public void test(int num) {} // 파라미터 선언부는 메소드 시그니처에 해당한다.
// public void test(int num2) {} // 에러남 -> 매개변수의 이름은 메소드시그니처에 영향을 주지 않는다.
/* 매개변수 갯수에 따른 오버로딩 성립 확인 */
public void test(int num1, int num2) {}
/* 매개변수 타입 변화에 따른 오버로딩 성립 확인*/
public void test(int num, String name) {}
/* 매개변수의 순서에 따른 오버로딩 성립 확인*/
public void test(String name, int num) {}
}
setter getter 가 한쌍으로 만들어야 하는 건 아니다
타입에 따라 조회용이냐 수정용에 따라
선택해서 쓴다
일반적으로 해당 데이터에대한 수정하고 조회 같이하려고 같이 한쌍으로 만드나
getter만 만드는 상황도 있다
ppt 클래스 구현하기