부품에 해당하는 객체들을먼저 만들고 하나씩 조립해서 완성된 프로그램을 만드는 기법
1. 객체란 (Object)
물리적으로 존재하거나 추상적으로 생각할수 있는것 중에서 자신의 속성을 가지고 있고 다른것과 식별 가능한 것.
객체 모델링
현실 세계의 객체를 소프트웨어 객체로 설계하는 것
객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정
메소드 호출
객체가 다른 객체의 기능을 이용하는 것
리턴값 = 클래스명.메소드(매개값, 매개값2, ...);
2. 객체 간의 관계
집합 관계
- 하나는 부품이고 하나는 완성품 해당
- 엔진, 타이어, 핸들, 구성 자동차와 이 부품들은 집합의 관계
사용 관계
- 객체간의 상호 작용, 객체는 다른객체의 ㅁ[[소드를 호출하여 원하는 결과를 얻어낸다
- 사람 -> 자동차 사용 (사용의 관계)
상속 관계
- 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계를 말한다
- 일반적으로 상위 객체 = 종류, 하위 객체 = 구체적 사물 해당
- 자동차는 기계의 종류
3. 객체 지향 프로그래밍 특징
캡슐화
- 객체를 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것
- 외부 객체는 객체의 내부 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드로만 이용할 수 있다
- 캡슐화의 이유 : 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다
- 접근 제한자를 사용, 객체의 필드와 메소드의 사용범위를 제한함으로써 외부로 부터 보호
상속
- 상위 객체를 재사용해서 새로운 객체를 만들기 때분에 하위 객체를 쉽고 빨리 설계할수 있도록 도와주고, 반복된 코드의 중복을 줄여준다.
다형성
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다
- 다형성은 하나의 타입에 여러 객체를 대입함으로서 다양한 기능을 이용할수 있도록 해준다
객체와 클래스
설계도 : 클래스
클래스로 부터 만들어진 객체 : 인스턴스
인스턴스화
- 클래스로 부터 객체를 만드는 과정
클래스 선언
- 선언 규칙
1. 하나 이상의 문자로 이루어져야 한다
2. 첫 번째 글자는 숫자가 올 수없다
3. '&','_' 외의 특수 문자는 사용 할 수 없다
4. 자바 키워드는 사용할 수없다
관례적으로 클래스 이름이 단일 단어라면 첫자를 대문자로 하고 나머지는 소문자로 작성한다.
각 단어의 첫머리 글자는 대문자로 작성하는것이 관례이다
소스 파일 이름 역시 클래스 이름과 대소문자가 같도록 해야한다
ex)
public class 클래스 이름 {}
두개 이상의 클래스가 선언된 소스 파일을 컴파일 하면 바이트 코드 파일은 클래스를 선언한 개수 만큼 생긴다.
소스 파일은 클래스 선언을 담고있는 저장 단위일 뿐, 클래스 자체가 아니다.
*파일 이름과 일치하는 클래스에만 public 접근 제한자를 붙일수 있다
*가급적 소스파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다
객체 생성과 클래스 변수
new 클래스();
- new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다
- new 연사자는 힙 영역에 객체를 생성 시킨 후 객체의 주소를 리턴하도록 되어 있다
클래스는 두가지 용도
하나는 라이브러리(API : Application Program Interface)용 다른 하나는 실행용
라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계된다
객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어 있다
클래스의 구성 멤버
클래스에는 객체가 가져야 할 구성 멤버가 선언 된다. 구성멤버에는 필드, 생성자, 메소드가 있다.
필드
- 객체의 고유 데이터, 부품 객제, 상태 정보를 저장하는 곳
ex) 자동차 객체
고유 데이터 : 제작 회사 모델
샹태 : 현재 속도, 엔진 회전수
부품 : 차체 엔진 타이어
- 선언 형태는 변수 But 하지만 변수가 아니다
* 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸된다,
* 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다
- 어디서든 선언 가능 but 생성자와 메소드 중괄호 블록 내부 선언 -> 로컬 변수
- 필드 (클래스 멤버 변수) -> 될수 있으면 필드라는 용어 그대로 사용
-필드의 초깃값
분류 | 데이터 타입 | 초기값 | |
기본타입 | 정수 타입 | byte | 0 |
char | \u0000(빈공백 ) | ||
short | 0 | ||
int | 0 | ||
long | 0L | ||
실수 타입 | float | 0.0F | |
double | 0.0 | ||
논리 타입 | boolean | false | |
참조 타입 | 배열 | null | |
클래스(String 포함) | null | ||
인터페이스 | null |
- 객체를 생성한 뒤 필드를 사용, 필드는 객체에 소속된 데이터
생성자
- 생성자는 new 연산자로 호출되는 특별한 중괄호 블록
- 객체 생성시 초기화 담당
- 필드 초기화,
- 메소드 호출 객체 사용할 준비
- 클래스 이름으로 되어있고 리턴 타입 X
- 생성자를 실행시키지 않고는 클래스로부터 객체를 만들수 없다
- new연산자에 의해 생성자가 성공적으로 실행되면 힙(heap)영역에 객체가 생성, 객체의 주소 리턴
- 리턴된 객체의 주소는 클래스 타입 변수에 저장되어 객체에 접근 할때 이용된다.
기본 생성자
- 컴파일러는 중괄호 {} 블록 내용이 비어있는 기본 생성자를 바이트 코드에 자동 추가
- 명시적으로 선언한 생성자가 한개라도 있으면, 컴파일러는 기본생성자를 추가하지 않는다
- 명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화 하기 위함
필드 초기화
- 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화 되어야 함
- 객체 생성 시점에 다양한 값을 가져야함 생성자의 매개값으로 값들을 받아 초기화
- 매개 변수 이름이 너무 짧으면 코드의 가독성이 좋지 않다
- 가능하면 초기화 시킬 필드 이름과 비슷하거나 동일한 이름을 사용 할 것을 권장
생성자 오버로딩(Overloading)
객체를 초기화하려면 생성자도 다양화 될 필요
매개변수를 달리하는 생성자를 여러개 선언하는 것
Car(String model, Strin color){}
Car(String color, String model)
-> 오버로딩이 아니다
다른 생성자 호출 (this)
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생
-> 매개변수 수만달리하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상
-> this() 코드 사용
* this() 자신의 다른생성자를 호출하는 코드로 바드시 생성자의 첫줄에서만 허용
메소드
메소드는 객체의 동작에 해당하는 중괄호 {} 블록을 말한다.
중괄호 블록은 이름을 가지고 있다, 메소드 이름
- 메소드를 호출 하면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행
- 메소드는 객체간의 데이터 전달의 수단 사용, 다른객체를 생성해서 다양한 기능을 수행, 필드를 읽고 수정하는 역할
메소드 선언
메소드 선언은 선언부(리턴타입, 메소드이름, 매개변수 선언)과 실행 블록으로 구성
메소드 선언부를 메소드 시그니처(signature)
메소드리턴 결과 타입 메소드가 실행할때 필요한 데이터를 받기 위한 변수
↓ ↓
리턴타입 메소드이름([매개변수선언, ...]){
실행할 코드를 작성하는곳
} <- 메소드 실행 블록
리턴 타입
리턴 타입은 메소드가 실행 후 리턴하는 값이 타입
메소드 이름
메소드 이름은 자바 식별자 규칙에 맞게 작성
*숫자로 시작하면 안되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다
*관례적으로 메소드명은 소문자로 작성
*서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자로 작성
매개 변수 선언
매개 변수는 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용
매개 변수의 수를 모를 경우
메소드의 매개 변수는 개수가 이미 정해져 있는 것이 일반적,
But 메소드를 선언 할 때 매개변수의 개수를 알 수 없는 경우
sum1(int [] values) => 와 같이 매개 변수를 배열 타입으로 선언
sum2(int ... values) => 와 같이 메소드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성되고 매개값으로 사용
ex) sum2(1,2,3,4,5) , sum2(new int[] {1,2,3,4,5}) => 자동으로 배열로 바꿔줌
리턴
리턴 값이 있는 메소드
- 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정
-> return 값이 없다면 컴파일 오류 발생 /* return 리턴값; */
*return문 사용 할 때 주의점
return문 이후의 실행문은 결코 실행되지 않음, -> Unreachable code 라는 컴파일 오류 발생
리턴 값이 없는 메소드(void)
- void로 선언된 리턴값이 없는 메소드에서도 return 문 사용
-> return;
메소드 호출
메소드는 클래스 내,외부의 호출에 의해 실행
클래스 내부의 다른 메소드에서 호출할 경우에는 단순한 메소드 이름으로 호출
클래스 외부에서 호출할 경우에는 클래스로부터 객체를 생성, 참조변수를 이용해서 메소드를 호출
객체내부에서 호출
클래스 내부에서 다른 메소드를 호출할 경우에는 다음과 같은 형태로 작성하면 된다
리턴값이 없거나 받고싶지 않은 경우 -> 메소드(매개값, ...);
리턴값을 받고 싶을 경우 -> 타입변수 = 메소드(매개값, ..);
* 변수 타입은 리턴 타입과 동일하거나, 타입 변환이 될수 있어야함
객체 외부에서 호출
외부 클래스에서 메소드를 호출하려면 클래스 객체 생성
클래스 참조변수 = new 클래스(매개값, ...);
객체가 생성 되었다면 참조 변수와 함께 도트(.) 연산자 사용 메소드 호출
참조변수.메소드(매개값, ...); // 리턴값이 없거나, 있어도 리턴값을 받지 않을 경우
타입 변수 = 참조변수.메소드(매개값, ...) // 리턴값이 있고, 리턴값을 받고 싶을 경우
메소드 오버로딩
클래스 내에 같은 이름의 메소드를 여러개 선언하는 것을 메소드 오버로딩 (overloading) 이라고 한다.
오버로딩(overloading) 사전적 의미 - 많이 싣는 것
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
접근제한자 (0) | 2021.10.03 |
---|---|
패키지 (0) | 2021.10.03 |
try-catch-finally (0) | 2021.08.18 |
열거 타입 (0) | 2021.07.25 |
배열 타입 (0) | 2021.07.25 |