(학) (공) (자)

01.11(9일차)

만석이 2024. 1. 11. 12:57

1교시

---무결성---

객체의 데이터 외부에서 직접적으로 접근하는것을 막는다.
객체 데이터를 외부에서 읽고 변경시 객체의 무결성이 깨질수있다.

ex)자동차의 속도는 음수가 될수없는데, 외부에서 음수로 설정하면 무결성이 깨진다.
따라서 객체 지향 프로그래밍에서는 메서드를 통해 데이터를 변졍하는 방법을 선호한다.  

데이터는 외부에서 접근하지 않도록 막고, 메서드를 통해 데이터에 접근하도록 한다.


---setter---

필드의 값을 세팅하는 메서드이다.

public class Car {
private int speed;
private boolean stop;

//지역변수가 우선권을 갖기때문에 this를 써서 구분해줘야한다. 그렇지않으면 모든 speed가 매개변수의 speed가 되어버린다.
public void setSpeed(int speed) {

if(speed<0) {
this.speed = 0;
return;
}else {
this.speed = speed;
}

}

}

정의 -> 호출 -> 명령실행 -> 명령끝나면 돌아온다 (반환값이 있으면 갖고돌아온다)


---getter---

필드의 값을 조회할때 사용하는 메서드

private 필드를 객체 외부에서 조회하기 위해 구현하는 메서드를 getter라고 한다.
private 필드는 객체 외부에서는 접근이 불가능 하지만, 필드가 선언된 클래스에서는 어디서든 접근이 가능하다.
따라서 메서드를 통해서 값을 꺼내올수있다.


public int getSpeed() {
return speed;
}

//main
int speed = car.getSpeed();


---생성자---

객체를 생성할때 호출되어 객체의 초기화를 담당하는 특별한 메서드이다.
객체를 생성하고 초기화 하기 위해서는 반드시 생성자를 호출해야 한다.
따라서 객체를 생성해야 하는 참조용클래스는 모두 생성자를 가지고있다.

생성자는 반환값이 없지만, void를 적지 않는다.
생성자는 stter의 역할을 대신할수있다.


---생성자정의---

접근제한자 클래스명(매개변수){

(작업하고싶은 코드)

}

 

 

2교시

---생성자---

자바의 모든 클래스에는 하나이상의 생성자가 정의되어 있어야한다.
클래스는 생성하면서 개발자가 직접 생성자는 선언하지 않았다면 자바 컴파일러가 기본생성자를 자동으로 제공해주고있다.
다만, 컴파일러의 눈에만 보일뿐 우리가 보는 코드에는 생략되어있다.

---기본생성자---
매개변수가 별도로 없으며, 코드블럭 안에는 코드가 없는 비어있는 생성자를 말한다.
만약 개발자가 직접 생성자를 선언한다면, 컴파일러는 선언된 생성자를 사용한다.


---매개변수생성자--- 

매개변수 생성한 순간 기본생성자는 사용할수없다
생성자에 전달할 매개변수가 부족하면 객체를 생성할수없다.

클래스 내부에서 선언된 필드의 기본값을 그대로 사용하고싶다면 매개변수가 부족하다고 생성하지 못할 이유가 없어야한다.

이 경우 자바는 생성자를 여러개 선언하는 것을 허용하고있다.
외부에서 제공할 수있는 데이터만큼 매개변수로 전달하여 객체로 생성할수있다.



---생성자/메서드 차이점---


메서드는 엔지든지 재호출이 가능
생성자는 객체를 생성할때만 딱 1번 호출이 가능


---생성자 선언이유---

생성자는 개체를 생성함과 동시에 객체를 초기화할수있다.
생성자를 통해 객체를 초기화 한다는 말은 객체를 사용하기위해 객체를 메모리에 올린다.
객체 멤버(필드)에 접근이 가능하므로 일반적인 메서드처럼 필드의 데이터를 초기화 할 수 있다.

생성자도 메서드처럼 if for 등등 사용가능하다.



---오버로딩---

자바에서는 하나의 메서드 이름으로 여러기능을 구현하는것

public Phone(String b, int s) {
brand = b;
series = s;
}



public Phone(String b, int s, String c) {

brand = b;
series = s;
color = c;
}


이렇게 이름이 같은 두개의 생성자를 만들고 

Phone p1 = new Phone("갤럭시", 24, "횐색");
Phone p2 = new Phone("아이폰", 1);

이름이 같은 매개변수가 있는 객체를 각각 만들어주면 
알아서 거기에 맞는 생성자를 찾아간다.




---오버로딩조건---

1.메서드이름 같아야한다.
2.파라미터의 개수가 달라야 한다.
3.파라미터의 개수가 같아도 타입이 다르면 가능하다.
4.파라미터의 개수가 같아도 순서가 다르면 가능하다.

 

3교시


---this---

1.변수명을 지을 때 최대한 구체적으로 명확하게 작명하는것이 효율적인 코드를 작성하는데 도움이된다.
2.함수나 생성자에서 매개변수는 클래스의 필드보다 우선순위가 높아서 대입연산자를 기분으로 왼쪽/오른쪽 변수 모두 매개변수를 뜻하게된다.
3.매개변수에 매개변수를 넣는 의미없는 코드가 된다. 이러한 상황을 해결하기 위해 this를 사용한다.



public Student(String name, int age, int studentID) {
this.name = name;
this.age = age;
this.studentID = studentID;
}


4,객체 자기 자신을 스스로 참조한다.
5.this 참조 변수는 객체가 자기 자신을 참조하는데 사용하는 변수
6.매개변수와 필드를 구분하여 사용할수있다.



---this( )---

현재 클래스에 선언되어 있는 생성자를 가리키는 키워드




---(오버로딩) 예제1---

public class BreadTest {
//각기 다른 기능을 하는 makeBread() 메서드를 세 개 만든다
//BreadMain에서 각각의 메서드를 호출했을때
//다음의 결과를 보고 각 메서드들의 내용을 작성해보자

//빵을 만들었습니다.   ->method 1을 호출해서 나온 결과
//-------------

//빵을 만들었습니다.
//빵을 만들었습니다.
// ......
//요청하신 N개의 빵을 만들었습니다.
//------------

//00빵을 만들었습니다.
//00빵을 만들었습니다.
//00빵을 만들었습니다.
//.....
////00빵을 N개 만들었습니다.


int bread;
String s;


public void MakeBread(int bread) {


this.bread = bread;



for(int i=0; i<bread; i++) {
System.out.println("빵을 만들었습니다.");
}

System.out.println("요청하신"+bread+"개의 빵을 만들었습니다.");

System.out.println("----------------------------------");
}



public void MakeBread(int bread,String s) {


this.bread = bread;
this.s=s;


for(int i=0; i<bread; i++) {
System.out.println(s +" 을 만들었습니다.");
}

System.out.println(s+"을 "+bread+"개 만들었습니다.");
}


public class BreadMain {
public static void main(String[] args) {
BreadTest breadTest = new  BreadTest();


breadTest.MakeBread(5);
breadTest.MakeBread(5,"뿡어빵");

}
}

}



----static---
변수나 메서드가 static으로 선언되면 객체를 생성하지 않아도 사용할수있다.
static으로 객체를 많이 만들어도 메모리에는 단 한번만 올라간다.

클래스 변수로 만들어준다.


---(static)예제1---

public class Bank {

private String name; //멤버 변수
private String tel; //멤버 변수 
 
static float interest = 10f; //클래스 변수

public Bank(String name, String tel) {
this.name = name;
this.tel = tel;
}

public void bankInfo() {

System.out.println("지점 : "+name);
System.out.println("번호 : "+tel);
System.out.println("이자율 : "+interest);
System.out.println("-------------------------");
}



}


//클래스 변수 사용할때는 클래스.변수명


Bank.interest=0.1f;
static 사용시 한번에 모든 객체값이 바뀐다.


bk1.interest = 0,1f;
bk2.interest = 0,1f;
bk3.interest = 0,1f;
static 미사용시 일일이 수정해줘야한다.



bk1.bankInfo();
bk2.bankInfo();
bk3.bankInfo();