국비코딩 Feb17 | overload차이점, 자바 클래스 이해하기, static 멤버 사용하는 법, 차 변속하기, 캡슐화, 게터세터 단축키
메인메서드에서 복사하는것임
생성자 오버로드 | 메서드 오버로드 | |
뜻 | 매개변수의 데이터타입이 다르거나 개수가 다를 때 같은 이름의 생성자를 2개 이상 만들 수 있게 허용하는 것 | 하는 일은 똑같은데 데이터 타입이나 개수가 다를 때 쓰는 기법 |
쓰는 이유? | 생성방식(모델명, 색상, 가격 등)이 달라질 때마다 클래스를 새로 만들어줘야함 (클래스와 생성자의 이름이 같아야 하기 때문) | 메오를 안쓰면 메서드가 엄청 많이 생겨남 그래서 사용자가 이걸 다 외워야해 ㅋㅋㅋ (plus했던거) |
▶ 생성자 overload(과적)
원래는 같은이름의 생성자가 2개 이상 있으면 안되는데 특정 조건에 의해 허용해주는 것
단, 매개변수의 데이터 타입이나 개수가 달라야함, 변수명은 전혀관계없음
오버로드가 없을 경우 ? 생성방법이 달라질 때마다(ex 모델명만 쓰는 경우, 모델명&가격 쓰는 경우, 모델명&가격&색상 쓰는 경우) 클래스를 새로 만들어줘야한다 (생성자 이름과 클래스 이름은 같아야하기 때문에 1클래스 1생성자이기 때문)
//1.일단은 만들어 놓는 경우
public NoteBook() {
}
//2. 만들면서 모델명을 지어주는 경우
public NoteBook(String name) {
this.name = name;
}
//3. 모델명과 가격을 지정하는 경우
public NoteBook(String name, int price) {
this.name = name;
this.price =price;
}
//4. 모델명과 색상을 지정하는 경우
public NoteBook(String m, String c) {
//받아온 변수와 넣을 멤버 변수의 이름이 다르면 this가 없어도 된다.
name = m;
color = c;
}
▶ 차 시동걸기, 변속하기
public class Car {
int gear;// 변수 만들어주고
boolean on;
public Car() { //생성자를 통해 변수에 값넣어주고
gear = 0;
on = false;
}
void start () { //시동거는 메서드
if(on==false) {
System.out.println("시동이 걸렸습니다.");
on = true;
}else {
System.out.println("이미 시동이 걸려 있습니다.");
}
}
void change (int gear) { //기어 변속하는 메서드
System.out.println(gear + "단으로 변속했습니다.");
this.gear = gear;
}
}
그리고 메인메서드
public static void main(String[] args) {
Car car = new Car(); // car를 쓰기 위해 car클래스에서 복사해옴
car.start(); //복사한 클래스 안에 있는 메서드 호출
car.change(3);
System.out.println("시동 상태 : " + car.on); //여기서 car.on은 car class 안에있는 속성
}
▶ method overload (메서드 과적)
하는 일은 똑같은데 데이터 타입이나 개수가 다를 때 쓰는 기법 -> 메소드에 통일감을 줄 수 있음
plus라는 함수를 double+int, int+long, byte+long 등등 수많은 조합에 다 만들어줄 수 없어
그래서 plus라고 메서드 이름은 통일하되 데이터 타입과 갯수는 다르게 해줘
package chap04.ex08.overload;
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator();
//if you not use overload, you should remember enormous name even just plus
OverPlus over = new OverPlus();
System.out.println(over.plus(2.7, "b"));
//you can put anyyyyy date type, 근데 Calculator 클래스에 만들어놨어야겠지
//어쨌든 얘도 데이터 타입별로 만들어놓기는 해야되는데 쓰는 이유는 메서드명을 기억하지
//않아도 돼서 인듯
}
}
메서드 이름만 1개인거지 데이터 타입별로 다 만들어놓기는 해야함
package chap04.ex08.overload;
public class OverPlus {
Double plus(Double a, int b) {
return a+b;
}
Double plus(Double a, long b) {
return a+b;
}
String plus(Double a, String b) {
return a+b;
}
Double plus(Double a, Double b, int c) {
return a+b+c;
}
Double plus(Double a, Double b, Double c) {
return a+b+c;
}
Double plus(Double a, Double b, long c) {
return a+b+c;
}
String plus(Double a, Double b, String c) {
return a+b+c;
}
} //이렇게 ! 여기에 있는 애들만 plus를 통해 쓸 수 있어 다른 데이터 타입 넣으면 오류남
- static member는 객체화 하지 않고 사용한다
- heap영역에 있는거는 쓰고나면 메모리 해제해야해 근데 이건 자바가 알아서 해줘 (garbage collector를 이용해서)
- static에 있는 class는 복사할 수 없어 이게 붕어빵 틀?
- 원본을 가지고 복사해서 돌렸는데 원본에 낙서를 했더니 같이 낙서가 되는 애를 static이라고 해, 얘도 원본이랑 똑같은거지
- 원본영역에 있는거는 복사해서 쓸 수 없음
- 일반 멤버는 영향 안받게 하고 싶을 때 사용하고
다른애들도 전체적으로 영향받게 하고싶다 하면 static 영역에 지정하면돼
- 실행 메서드는 하나만 있어야돼서 static으로 딱 박아놓은거임
- 같은 클래스에 있더라도 저장영역이 static과 heap으로 다르다면 불러올 수 없음
그래서 쓰려는게 heap에 있다면 (앞에 static이 없다면) 그런 경우엔 복사해서 써야함
-static을 객체화 하지 못하는 이유
이렇게 일반 멤버를 사용할 땐 복사를 해서 사용하는게 일반적
반면 static 멤버를 사용할 땐 원본에 접근해야함 복사가 아니라, class 이름을 직접적으로 써서 호출
하지만 이 방법을 하도 많이 틀려서 sub.sField로 접근해도 연결은 시켜줘
다만 그건 정식적인 방법은 아니라는 것
일반 멤버인 field에 연결했을 때는 값이 연결이 안되어있어서 다르게 나타났지만
원본인 sField에 연결하니까 값이 연결돼서 똑같이 나타나는 것 확인 가능
▶ final
static final은 절대 바꿀 수 없는 값 = 상수 (ex 파이)
상수는 모두 대문자로 표기해야함
final은 생성자에서만 초기화(변경)할 수 있음 (프로그램이 종료될 때까지 바뀌지 않음)(초기값은 주어지지 않음)
package chap04.ex10.readonly;
public class Person {
//final: 생성자에서 초기화가 가능하다 (이후 프로그램이 종료될 때 까지 바뀌지 않음)
final String nation;
final String name;
//static final : 상수, 불변의 값, 개발자가 작성하면 이후로 변경할 수 없다
static final String SSN="800902-1234567";
public Person(String nation, String name) { // 생성자에서 final값을 초기화할 수 있따.
this.nation = nation;
this.name = name;
}
}
그래서 얘의 메인메서드에서는
package chap04.ex10.readonly;
public class Main {
public static void main(String[] args) {
Person p = new Person("대한민국","최은영");
System.out.println(p.nation);
System.out.println(p.name);
System.out.println(Person.SSN);
/* final값은 한 번 들어가면 바꿀 수 없, 그래서 밑에 코드도 오류남
p.nation = "KOREA";
P.name = "홍길동";
*/
}
}
▶ 다른 패키지에 있는 클래스를 가져오는 방법 2가지
1. import문
2. public으로 접근제한자로 바꿔주기
▶ import
다른 package(폴더)에 있는 class를 가져올 수 있다
자동완성을 해야 이 import문이 자동으로 찍혀
▶ 접근제한자
특정멤버의 접근 영역을 제한한다
public 아무 제한 없다
default 같은 패키지만 사용 가능
private 클래스 안에서만 사용 가능
아무것도 적지않았으면 접근제한자가 default인거임
private는 class 안에서만 써야함
그래서 아무것도 안적혀 있던 OverPlus class의 생성자들 앞에 public을 붙여줘야함
▶ 캡슐화
사용자들이 이상한거 건들여서 실수를 막기위해 함
숨겨놓기 위해서임
밖에서 조절해야한다면 게터세터로 필요한거에 대해서만 꺼내오는거
▶ private 접근제한자를 연결하는법
private 필드 중에서 가져오거나, 변경하고 싶은 것들은
getter()또는 setter()메서드를 활용해서 가능하다 ( 단축키 : alt+shift+s )
굳이 왜 getter setter로 가져옴? public으로 하면되잖아 -> 특정한 것에 제한을 주고 싶어서
선택해서 열어주려고