NewlecExam을 호출하려면 virtual를 써줘야한다. virtual를 붙이면 바인딩을 미룬다. 함수의 위치를 객체가 가진다. 객체가 갖고있는 상자를 열어서 점프하게한다. 전달되는 객체에따라 달라진다.
컴파일 : static 바인딩 (virtual 아닌것) 실행 : dynamic 바인딩 다이나믹바인딩, 동적바인딩 : 컴파일할때 바인딩하지않도록하고 실행할때 (자바는없음) 객체가 가지고오는 주소로가라. 실행되어야만 알 수 있다.
자바는 모든 메소드가 virtual이다. 자바는 모두 동적바인딩
자바의 함수 호출
자바는 동적바인딩만 지원하므로 모든 함수호출이 점프하는곳이 결정을 미룬다.
점프할곳을 어떻게찾는가 ? 클래스가 만들어지면 점프번지를 기록하는 virtual 테이블이존재. 위치정보를 가지고있음 객체가만들어질때 추가적으로 4바이트씩 더 가진다. 그 4바이트가 자기가 가지는 메소드의 위치를 기록하는곳을 가리킨다. 객체가전달될때 전달된 객체의 앞머리를통해 그쪽 total()로가게된다. 전달된 내용의 앞머리를 통해 virtual 테이블의 주소로 간다. 전달되는 객체가 뭐냐에따라 달라지게된다. 전달된 객체가 뭐냐에따라서 전달된 객체의 함수로 가게된다. 동적으로 실행해봐야 아는, 실행중에 주소가 결정되는 시스템
함수호출시 항상 자료형보다는 전달되는 객체가 뭐냐가 중요하다. 자료형: 형식은 한정만 시킨다.
객체지향 프로그래밍 : 객체를 중심으로 하는 프로그래밍 객체를 프로그램을 구성하는 기본단위로 본다.
객체에게 함수는 어떤 존재인가요 ? 기능,서비스로서의 존재이다. 서비스를 구현할 때 함수의 원래 목적인 나누기, 집중화, 재사용
객체-역할자-기능/서비스
class 상점관리{ private 점원 점원1; private 손님 손님1;
}
구조적함수 : 데이터구조에 영향을 받는것모아둔것
객체지향:객체의 행위를 모아둔것, 좀더 큰단위의 함수들 public 외부로노출해야할 객체행위 private 반복,중첩,내부적으로 쓸 구조적방식함수 과거 구조적프로그래밍 + 함수를 묶는개념 선택적으로 만든다. 분석,기획-객체찾게되고 서비스를찾음-서비스를 구조화시킴-함수를 구현(절차작성)-API
객체지향적 관점 :~를 담당하는 것으로 볼것. 역할자로보는것 : 캡슐화, 클래스,객체
Has A상속 : 다른객체를 가지고 자기를 구현
자바실습 정리:
출력역할을 위한 캡슐을 만들자 ->lotto가 필요하다 그래서 lotto를 가지게된다 this가 lotto를 가진다. has a 생성은 외부에서, 또는 자기스스로 하는게있다, (composition, association)
포함관계: 부품관계 has관계 객체로 객체단위로 나누기,집중화,재사용가능 나누기 : has 집중화 : is a 재사용 둘 다 가능
[객체지향] 프로그래밍 : 프로그램 => 코딩(절차를 다루는 부분) + (절차를 나누고 정리하는 부분) : 구조적인 방법 / 객체지향적인 방법 구조적인 방법과 객체지향 방법은 절차를 나누고 정리하는 방법에서 어떤 차이가 있는가
절차만드는것 : 배열까지 배운것들
절차를나누고, 정리하는것은 사용자에게 보이지않는 부분이다.
절차를 나누는 방법(함수를 나누는 기준은)에서의 차이는? -구조적인 방법에서는 크기나 중첩/복잡도 높아지는 부분에서 코드를 나누었다. (IBM에서는 3년차 코딩 경험을 50라인 정도 ...) 재사용/반복(집중화)/난이도 높아/...
내가 감당할 수 있는정도가 기준이었다->애매함
코드를 잘게 쪼갠다. 복잡하면 나눈것
-객체지향 방법에서는 객체가 서비스하는 단위(실세계에서 객체의 행위)가 추가됨. //함수를 나누는 방법이 늘어남