==객체지향프로그래밍
객체를 기반으로 프로그래밍을 작성하는 언어
부품 객체 만들고 하나씩 조립
그렇다면 자바에서 상속은?
단위 상속만 허용
하위 클래스가 상위 클래스가 허용한 멤버(속성,메소드)를 물려받고 기능을 확장함
여러 개의 하위 객체를 일반화 시켜 참조 가능, 기존에 만들어진 상위 객체를 재사용해서 하위 객체를 빠르게 개발 가능-> 반복된 코드의 중복을 줄이고, 유지 보수의 편리성으 제공하며, 객체의 다형성을 구현할 수 o
그렇다면 자바에서의 캡슐화는?
클래스와 객체로 이루어짐
클래스: 객체 모양을 선언한 툴(캡슐화)-붕어빵 틀
메소드(멤버 함수)와 필드(멤버 변수)는 모두 클래스 내에 구현
객체: 클래스 모양대로 생성된 실체(instance)-초코붕어빵,팥 붕어빵,슈크림 붕어빵
객체 내부 데이터를 보호하고 외부 접근을 제한한다. (객체 외부에서는 비공개 멤버(필드, 메소드)에 직접 접근할 수 x,접근이 필요하면 공개된 메소드(getter,setter등)를 통해 접근할 수 o)
그렇다면 자바에서의 다형성은?
객체에 따라 같은 메소드를 이용해 다양한 동작 구현 가능, 이름 다르게 만들지 않아도 o, 공통 메소드 이름을 사용함으로써 직관적인 사용과 반복기능 o
메소드 오버로딩, 메소드 오버라이딩, 인터페이스를 활용, 어떤 메소드가 실행될지는 실행 중 동적으로 바인딩 됨
고유한 특성&행동을 가짐
다른 객체와 상호작용하며 존재
ex) 게임에서 캐릭터와 무기, 아이템들, 테트리스 게임의 각 블록들, 한글 프로그램의 메뉴나 버튼들
개념상-어떤 일을 처리하기 위한 데이터(변수, 속성, 필드)와 기능(메소드, 함수)을 하나로 묶어놓은 개념을 구체화 한 단위
문법상-변수+메소드, C구조체에 함수가 추가된 구조
클래스: Car.java, 강아지.java
클래스==객체를 위한 설계도(필드+메소드를 위한 설계도), 객체를 생성하기 위한 필드와 메소드가 정의됨->객체의 속성과 행동이 포함됨
클래스로 만들어진 객체를 해당 클래스의 인스턴스라고 부름, 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 o
객체: 클래스의 인스턴스
클래스의 모양 그대로 찍어낸 실체, 프로그램 실행 중 생성되는 실체, 메모리 공간을 갖는 구체적인 실체
ex) 클래스: 사람 - 객체: 나, 엄마, 아빠, 언니
클래스: 붕어빵틀 - 객체: 팥붕, 슈붕 등
객체는 클래스에 선언된 동일한 속성을 가지지만, 객체마다 서로 다른 고유한 값으로 구분
한글이름 가능하나 대부분 영어 이름으로 작성
클래스 이름은 대문자로 시작 (알파벳 대소문자 다른 문자로 인식)
첫 글자와 연결된 다른 단어의 첫 글자 역시 대문자로 작성
1. 하나 이상의 문자
2. 첫 번재 글자는 숫자 x
3. $,_ 이외의 특수 문자 사용x
4. 자바 키워드 사용 x
소스 파일 생성: 클래스이름.java(클래스 이름은 대문자로 !!!)
소스 작성하고 컴파일을 javac.exe로 돌리면 클래스이름.class (바이트 코드)가 만들어짐
하나의 파일에서 두 개 이상의 클래스 선언이 가능하지만 한개씩 쓰기
소스 파일 이름과 동일한 클래스만 public으로 선언 가능, 선언 개수만큼 바이트 코드 파일 생성


클래스의 멤버: 클래스의 필드(변수)와 메소드
int a로 설명해보자면
int는 변수 a를 위한 클래스, a는 int의 인스턴스인 객체
int를 실체화 한 변수인 a를 우리는 사용할 수 o
Circle c;//c라는 객체 선언 (Circle 클래스의 인스턴스)
Circle d= new Circle();//Circle클래스 모양의 객체를 생성한 후 ! Circle 변수 d에 저장
실제 메모리 영역에서 Circle에 필요한 만큼의 메모리를 할당 받고 ! d가 그 영역을 참조한다
객체는 반드시 new 키워드를 사용하여 선언 (new는 객체의 생성자 호출)
객체 생성 과정
1. 객체에 대한 레퍼런스 변수를 선언한다.
2. 객체를 생성한다. (클래스 타입의 크기의 메모리가 할당되며 객체 내 생성자 코드 실행)
접근하는 법: 객체레퍼런스변수.멤버

객체가 생성될 때 초기화를 위해 실행되는 메소드
특징
1. 특별한 메소드로서, 리턴타입이 없다.
2. 객체를 생성할 때 초기화하기 위한 목적으로 사용한다.
3. 생성자는 new를 통해 개체를 생성할 때 한 번 호출된다. 반드시 호출된다.
4. 클래스 내에서 하나 이상 선언되어야 한다.
5. 개발자가 생성자를 생성하지 않는다면, 컴파일러가 자동으로 기본 생성자를 삽입한다.
강아지 a=new 강아지(); //생성자 호출
강아지 b=new 강아지("양숑숑");//이름을 '양숑숑'으로 설정할 수 있는 생성자를 오버로딩 한 것
!!! 생성자 이름은 반드시 클래스 이름과 동일해야한다 !!!
생성자는 필요에 따라 여러 개 작성이 가능하다->메소드 오버로딩
기본 생성자: 매개 변수x, 아무 작업 없이 단순 리턴, 디폴트 생성자라고 부르기도 함
기본 생성자를 꼭 넣어두자 왜냐면 개발자가 생성자를 하나라도 만들면 자동생성이 되지 않기 때문=기본 생성자를 만들지 않고, 생성자를 만들어서 기본 생성자를 호출한다면 컴파일 오류가 생김
또, 상속되었을 때 생성자는 상속이 되지 않는다는거 기억하기!
this 레퍼런스: 객체(인스턴스)자신의 참조주소를 갖는 레퍼런스
컴파일러에 의해 자동으로 관리, thie.멤버 형태로 멤버를 사용
객체 내부에서 인스턴스 멤버임을 명확하게 해주며
매개변수와 필드 이름이 같을 때, 구분이 명확하다.
다른 메소드를 호출 할 때 객체 자신의 레퍼런스를 전달하거나 반활할 때 유용하다.

객체를 담은 배열공간을 만들고 각 배열공간에 생성한 객체의 주소를 저장한다
생성과정은 일반배열과 같음