객체간의협력
- 객체 지향 프로그램에서 객체간에는 협력이이루어짐
- 협력을 위해서는 필요한 메시지를 전송하고 이를 처리하는 기능이 구현되어야함
- 매개변수로 객체가 전달되는 경우가발생.

여러 인스턴스 공통으로 사용하는 변수
- 여러 인스턴스가 공유하는 기준값이 필요한 경우
- 학생마다 새로운 학번 생성
- 카드회사에서 카드를 새로발급할떄 마다 새로운 카드번호를 부여

static변수 선언과 사용하기
static int seraalNum;
- 인스턴스가 생성될떄 만들어지는 변수가아닌, 처음 프로그램이 메모리에 로딩될떄 메모리를 할당
- 클래스변수,정적변수라고 함
- 인스턴스 생성과 상관없이 사용가능하므로 클래스 이름으로 직접참조.
- Student.seraalNum=100;
static 변수를 선언해줌.



static변수는 인스턴스에서 공통으로 사용하는 영역임을 알수있다.


인스턴스변수에서 사용가능하기떄문에 오류가 발생하지않는다
클래스이름으로 참조해서 써라 라는 뜻
static 메서드(클래스 메서드)에서는 인스턴스 변수를 사용할 수 없다
- static메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출될 수 있음
- 인스턴스 생성 전에 호출될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용하지않음.

int i처럼 지역변수를 사용하는건 상관없다.
하지만 인스턴스변수를 사용하면 오류가 발생.

- static변수는 프로그램이 메모리에 있는동안 계속 그영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지않음
- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성시 쓸데없는 메모리가 할당됨
- 상황에 적절하게 변수를 사용해야함
싱글톤 패턴이란?

static으로 제공해야 인스턴스를 바로 사용할수있음.

배열
- 동일한 자료형의 순차적 자료구조
- 인덱스 연산자[]를 이용하여 빠른 참조가 가능
- 물리적위치와 논리적위치가 동일
- 배열의 순서는 0부터 시작
- 자바에서는 객체 배열을 구현한 ArrayList를 많이활용함.




char도 정수이기떄문에 계산을해보면 이렇게나온다.
객체배열 선언과 구현
- 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만,
객체배열 복사하기

- 얕은 복사
- 객체주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정 됨
즉, 두 배열이 같은 객체를 가리킴.


주소도 똑같은것을 볼수있습니다.
다차원 배열
- 이차원 이상으로 구현 된 배열
- 평면(이차원 배열)이나 공간(삼차원 배열)을 활용한 프로그램 구현
int [][]arr=new int[][]



클래스 상속
- 새로운 클래스를 정의 할 때 이미구현된 클래스를 상속 받아서 속성이나 기능을 확장하여 클래스를 구현함
- 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할떄 기존클래스를 상속함.

상속을 구현하는 경우
- 상위 클래스는 하위 클래스보다 더 일반적인 개념과 기능을 가짐.
- 하위 클래스는 상위 클래스보다 더 구체적인 개념과 기능을 가짐
- 하위클래스가 상위 클래스의 속성과 기능을 확장(extends)한다는 의미


protected 하위클래스는 사용가능.
외부클래스는 불가.


하위 클래스가 되는과정
super() 하위클래스가 상위클래스의 참조값가짐.
super키워드
- 하위 클래스에서 가지는 상위 클래스에 대한 참조 값
- super()는 상위 클래스의 기본 생성자를 호출 함
- 하위클래스애서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출됌

형변환
- 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성
- Customer customerLee=new VIPCustomer();

메서드 재정의하기
- 오버라이딩:상위 클래스에 정의된 메서드의 구현내용이 하위클래스에ㅐ서 구현할 내용과 맞지않는경우 하위클래스에서 동일한 이름의 메서드를 재정의
형 변환과 오버라이딩 메서드 호출
- Customer vc=new VIPCustomer();
- vc변수의 타입은 Customer지만
메서드는 어떻게 호출되고 실행되는가?

가상함수
- 가상메서드 테이블에서 해당 메서드에대한 address를 가지고 있음
- 재정의된 경우는 재정의된 메서드의 주소를 가리킴.

다형성
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
-같은 코드에서 여러 다른 실행 결과가 나옴
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징중 하나임
- 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있음.
상속은 언제 사용할까?
- 일반적인 개념과 구체적인 개념과의 관계
- 상위 클래스:하위 클래스보다 일반적인 개념
- 하위 클래싀:상위 클래스보다 구체적인 개념들이 더해짐
- 상속은 클래스간의 결합도가 높은 설계
- 상위 클래스의 수정이 많은 하위 클래스에 영향을 미칠 수 있음
- 계층구조가 복잡하거나 hierachy가 높으면 좋지않음
HAS-A관계
- 클래스가 다른 클래스를 포함하는 관계(변수로선언)
- 코드 재사용의 가장 일반적인 방법
- Student가 Subject를 포함하는
- Library를 구현할떄 ArrayList를 생성하여 사용
- 상속하지 않음.
다운 캐스팅
- 업캐스팅된 클래스를 다시 원래의 타입으로 형변환
- 하위 클래스로의 형 변환은 명시적으로 해야 함

추상 클래스란?
- 구현 코드 없이 메서드의 선언만 있는 추상메서드를 포함한 클래스
- 메서드 선언:반환타입, 메서드 이름, 매개변수로 구성
- 메서드 정의:메서드 구현과 동일한 의미 구현부를 가짐
-예 int add(int x,int y) //선언
- int add(int x,int y){} // 구현부가있음 ,추상메서드 아님
- abstract 예약어를 사용
- 추상 클래스는 new 할 수 없음(인스턴스화 할 수 없음)


추상클래스의 응용-템플릿 메서드 패턴
- 템플릿 메서드
- 추상메서드나 구현된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드
- final로 선언하여 하위 클래스에서 재정의 할수 없게함
- 프레임워크에서 많이 사용되는 설계패턴
- 추상 클래스로 선언된 상위클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위클래스에서 구현하도록 함





wiper를 추가해줬더니 오류가발생하는것을 볼수있다
기존에는 없었는데 갑자기 추상클래스가 추가됬기떄문에
구현을 해줘야한다.


추가해줬더니 오류가 없어진것을 볼수있다.
인터페이스란?
- 모든 메서드가 추상메서드로 선언됨 public abstract
- 모든 변수는 상수로 선언됨 public static final

