1. 객체지향언어ⅰ
특징
- 코드의 재사용성이 높다.
- 유지보수가 용이하다.
- 중복코드 제거에 용이하다.
핵심개념
- 다형성
- 상속
- 추상화
- 캡슐화
A. 클래스와 객체
클래스
- 클래스 : 클래스는 객체를 정의해 놓은 설계도의 개념으로 객체를 생성하기 위해서 존재한다.
- 형태 : 데이터 + 함수의 형태로 이루어져 있으며 서로 관련된 여러 데이터를 하나로 저장할 수 있는 공간.
- 사용자 정의 타입 : 사용자가 원하는 타입을 직접 만들 수 있다.
객체
- 객체 : 객체란 인스턴스 변수(iv)의 묶음으로, 실제로 존재하는 것. 용도는 기능과 속성에 따라 다르다.
- 클래스에서 객체를 생성할 때를 일컬어 '인스턴스화'라고 말한다.
- 객체 생성 방법 : 클래스명 참조변수명 = new 클래스명(); | ex) People p = new People();
- 객체배열 생성 방법(참조변수의 배열) : 타입[] 배열명 = new 타입[n]; (★객체배열 생성 후 반드시 객체를 생성해야 한다)
B. 변수의 종류
변수는 선언 위치에 따라 종류가 다르다. 영역은 크게 두 가지로 나뉘며, 클래스 영역과 메소드 영역이다.
클래스 영역
- 클래스 변수(cv)
- 객체 생성이 필요 없다.
- 아무때나 사용 가능하다.
- 클래스가 메모리에 올라갈 때 생성된다.
- 클래스 변수는 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
- 형태 : 클래스명.변수명 | ex : card.width = 50;
- 인스턴스 변수(iv)
- 객체를 생성해야 사용할 수 있다.
- 객체 생성이 꼭 필요하다.
- 인스턴스가 생성될 떄 생성 된다.
- 인스턴스가 생성될 때마다 생성되므로 각각 다른 값으로 유지할 수 있다.
- 형태 : 참조변수.변수명 | ex: c.kind = "spade";
▶ 클래스 변수와 인스턴스 변수의 추가 설명(카드를 예로)
객체의 속성 : 숫자, 무늬와 같은 개별속성은 인스턴스 변수(iv)로 카드의 폭, 높이와 같은 카드의 공통속성은 클래스 변수로 지정한다.
메소드 영역
- 지역 변수(lv)
- 클래스 이외의 영역(메소드, 생성자, 초기화 블럭 내부)에서 선언된다.
- 메소드가 종료될 때 같이 제거 종료 된다.
- 변수 선언문이 수행했을 때 생성된다.
- 메소드 내에 선언된 변수로메소드 영역이 서로 다른 지역변수들은 지역변수명이 같아도 상관없다.
C. 메소드(함수)
특징
- 메소드는 문장의 집합으로 이 집합은 문장들을 작업단위로 묶어서 명칭을 붙인 것을 의미한다.
- 값(입력)을 받아서 처리(구현부)하고, 결과를 반환(출력)하는 구조를 지닌다.
- 반드시 클래스 안에 존재해야 한다.
장점
- 코드의 중복을 줄일 수 있다.
- 한 곳에서 수행하기 때문에 관리가 쉽다.
- 코드의 재사용이 가능하다.
- 코드가 간결하여 이해하기 쉽다.
메소드의 작성
- 메소드는 반복되는 여러 문장을 메소드로 작성을 하는 것으로, 하나의 메소드에 한 가지 기능만 수행하도록 작성하는 것이 좋다.
- 메소드는 기본적으로 선언부, 구현부, 출력부가 있으며 선언부를 통해 값을 입력받고 구현부를 통해 입력 받은 값이 처리되면 출력부를 통해 결과값을 반환하는 형태로 구성된다.
형태
반환타입 메소드명(타입 변수명, 타입 변수명···) {
메소드 호출 시 실행될 코드 작성
} return;
int add(int x, int y){
int result = x + y;
} return result;
메소드의 실행 흐름
객체생성 → 메소드 호출 → 메소드의 구현부 작성 → 호출한 곳으로 반환
return문
- 실행중인 메소드를 종료하고 호출한 곳으로 값을 반환한다(되돌아간다)
- 반환타입이 void일 경우에는 return을 작성하지 않아도 되지만 타입이 존재할 경우 반드시 return을 작성해야 한다.
- 반환값이 void가 아니면 무조건 return을 사용해야 하며, return과 반환타입을 일치시켜야 한다.
- 메소드 내에서 조건식을 작성할 때 return문이 거짓일 경우에도 쓰여있는지 확인한다.
매개변수의 유효성 검사
- 부적절한 값이 들어오면 매개변수의 값을 보정 또는 return문으로 작업을 중단하고 호출한 메소드로 되돌아가게 하는 코드를 반드시 넣어야 한다.
기본형 매개변수와 참조형 매개변수
- 기본형 : 변수의 값을 읽기만 가능하다(Read Only)
- 참조형 : 변수의 값을 읽고 변경할 수 있다(Read & Write)
호출스택
- 메소드 수행에 필요한 메모리가 제공되는 공간
- 메소드가 호출되면 호출스택에 메모리가 할당 되고, 종료되면 해제
- FILO(First In Last Out)방식으로 처음 들어간 메소드가 제일 나중에 처리되며 맨 위의 메소드를 처리하는 동안 나머지 메소드는 대기 상태로 유지 된다.
참조형 반환 타입
- 객체 주소를 반환한다.
- 값이 아닌 객체의 주소를 받기 때문에 객체를 다룰 수 있다.
- 재귀호출: 메소드가 자기 자신을 호출하여 일을 시키는 것
클래스 메소드와 인스턴스 메소드
차이점 : 클래스 메소드와 인스턴스 메소드의 가장 큰 차이점은 인스턴스 변수의 사용여부다. 인스턴스 메소드는 클래스 변수와 인스턴스 변수 모두 사용할 수 있는 반면에 클래스 메소드는 인스턴스 변수를 사용할 수 없다.
인스턴스 메소드
- 반드시 객체를 통해 인스턴스를 생성하고 [ 참조변수.메소드명() ]의 형태로 호출한다.
- 인스턴스 멤버(im, iv)와 관련된 작업을 하는 메소드다.
- 메소드에서 인스턴스 변수를 사용할 수 있다.
- 인스턴스 메소드는 클래스 메소드를 호출할 수 있다.
클래스(static) 메소드
- 객체생성 없이 [ 클래스명.메소드명() ]의 형태로 호출한다.
- 인스턴스 멤버(im, iv)와 관련없는 작업을 하는 메소드다.
- 메소드 내에서 인스턴스 변수(iv)를 사용할 수 없다(iv를 사용하지 않는건 static을 붙이면 된다)
- 클래스 메소드는 인스턴스 메소드를 호출할 수 없다.
D. 오버로딩(Overloading)
한 클래스 내에서 같은 이름의 메소드를 여러개 정의 하는 것으로, 대표적인 예로 print() 메소드가 있다.
오버로딩의 성립 조건
- 메소드명이 같아야 한다.
- 매개변수의 개수 또는 매개변수 타입이 달라야 한다.
- 반환타입은 영향 없다.
오버로딩을 사용하는 이유
- 같은 기능을 제공하는 메소드를 하나의 이름으로 사용할 수 있다. 그렇기 때문에 메소드 명칭을 절약할 수 있다.
E. 오버라이딩(Overriding)
조상(부모) 클래스로부터 상속 받은 메소드를 자신(자식)에 맞게 재정의(변경)하는 것으로, 상속 받은 메소드를 그대로 사용하는 것이 아니라 자손(자식)의 상황에 맞게 변경하여 사용한다는 의미다.
오버라이딩의 성립 조건
- 선언부가 조상(부모)와 일치해야 한다(메소드명, 매개변수, return값)
- 접근제어자를 조상클래스보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 메소드 보다 많이 선언할 수 없다.
오버로딩과 오버라이딩 차이점(표)
구분 | 오버라이딩(Overriding) | 오버로딩(Overloading) |
접근제어자 | 조상클래스 메소드의 접근제어자보다 더 넓은 범위의 접근제어자를 자손이 설정할 수 없다. | 모든 접근제어자를 사용할 수 있다. |
리턴 타입 | 조상과 자손 모두 동일해야 한다. | 조상과 자손이 서로 달라도 된다. |
메소드명 | 조상과 자손 모두 동일해야 한다. | 조상과 자손 모두 동일해야 한다. |
매개변수 | 조상과 자손 모두 동일해야 한다. | 조상과 자손이 서로 달라야 한다. |
적용 범위 | 상속 관계 | 같은 클래스 내부 |
F. 생성자
인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메소드'다.
생성자의 작성 규칙
생성자명이 클래스명과 같아야 한다.
생성자는 return값이 없다(void 안 붙임)
모든 클래스는 반드시 생성자를 가진다.
생성자의 종류
- 기본 생성자
- 형태 : 클래스명() { }
- 매개변수가 없는 생성자
- 생성자가 하나도 없을 때만 컴파일러가 자동추가 해준다. 왜냐하면 기본 생성자는 반드시 필요하기 때문에.
- 매개변수가 있는 생성자
- 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있게 된다.
- 인스턴스 생성 후 인스턴스변수의 값을 변경하는 것보다 더욱 코드가 간결하다.
G. this
생성자 this()
- 생성자에서 같은 클래스의 다른 생성자를 호출할 때, 클래스명 대신 this를 사용한다.
- 다른 생성자 호출 시 첫 줄에서만 사용 가능하다(다른 생성자로 인해 호출이전의 초기화 작업이 무의미해지므로 무조건 첫줄에 작성해야 한다)
참조변수 this
- 인스턴스변수(iv)와 지역변수(lv)의 이름이 같을 때 구별하기 위해 사용한다. 만약 변수 앞에 this가 붙으면 인스턴스변수가 되고, 안 붙이면 매개변수와 가까운 지역변수가 된다.
- 인스턴스 자신을 가르키는 참조변수(객체의 주소가 저장되어 있음)
- 인스턴스메소드에서 사용할 수 있다. 단, static 메소드에서는 사용할 수 없다.
변수의 초기화
- 멤버변수(ic, cv)는 자동초기화 한다.
- 지역변수(lv)는 수동으로 초기화 한다.
멤버변수의 초기화화 시기 및 순서
자동초기화 : ∮
간단초기화 : =
복잡초기화
- {} : 거의 사용하지 않는다.
- static{} : cv 클래스가 처음 메모리에 올라갈 때 단 한번 초기화 한다.
- 생성자(){} : 인스턴스변수를 초기화 하며 인스턴스가 생성될 때마다 초기화 한다.
멤버변수의 초기화시기와 순서
클래스 초기화 | 인스턴스 초기화 | |||||
기본값 | 명시적 초기화 | 클래스 초기화 블럭 | 기본값 | 명시적 초기화 | 인스턴스 초기화 블럭 | 생성자 |
cv[0] | cv[1] | cv[2] | cv[2] iv[0] |
cv[2] iv[1] |
cv[2] iv[2] |
cv[2] iv[3] |
순서 : 1 | 2 | 3 | 4 | 5 | 6 | 7 |
우선순위 : cv → iv / 자동(∮) → 간단(=) → 복잡({}, 생성자)
'Java > Basic' 카테고리의 다른 글
객체지향의 기본 개념 정리2 (0) | 2021.07.19 |
---|---|
캡슐화 (0) | 2021.07.05 |
인터페이스(interface) (0) | 2021.04.15 |
추상클래스(abstract class) (0) | 2021.04.08 |
다형성(polymorphism) - 매개변수의 다형성 (0) | 2021.04.03 |
댓글