1018

란이:)·2022년 10월 18일
0

공부일지

목록 보기
9/30

객체 지향 언어

현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며 발생하는 모든 사건들은 객체 간의 상호작용이다.
이 세계관을 프로그래밍 언어에 도입하여 만들어진 언어가 객체 지향 언어이다.

카페에 있는 객체 손님, 캐셔, 바리스타
손님: 주문 하는 행위, 결제, 받고 나가는 역할
캐셔 : 주문 받기, 결제, 바리스타 주문전달
손님과 바리스타와 상호작용을 해야함

객체 사이의 메시지를 통해 상호작용
메시지 = 메소드

홍반장 : 동네일을 다 처리함
객체입장에서는 안좋음

메소드의 명칭은 동사형태

변수는 명사형 소문자로

김춘수 꽃

내가 그의 이름을 불러 주었을 때
그는 나에게로 와서
꽃이 되었다.

호출해야 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 클래스 구현하기

profile
FE Developer 🐥

0개의 댓글