객체 지향 프로그래밍(OOP)
- 객체란?
- 주체가 아닌 것,주체가 활용하는 것
- 객체지향 프로그래밍
- 주변의 많은 것들을 객체화 해서 프로그래밍 하는 것
- 객체지향은 객체를 많이 만드는 것을 추천한다?
객체지향 프로그래밍의 장점
- 블록 형태의 모듈화된 프로그래밍
- 신뢰성 높은 프로그래밍이 가능하다
- 추가/수정/삭제가 용이하다
- 재 사용성이 높다
현실 세계 객체, 클래스,프로그램의 객체(instance,object)의 관계
- 현실의 객체가 갖는 속성과 기능은 추상화(abstraction) 되어 클래스에 정의된다!
- 클래스는 구체화 되어 프로그램의 객체(instance,object)가 된다
- 프로그램의 클래스와 객체
- 클래스
- 객체를 정의해 놓은 것 즉 객체의 설계도,틀
- 클래스는 직접 사용할 수 없고 직접 사용되는 객체를 만들기 위한 틀을 제공할 뿐
- 객체(instance,object)
- 클래스를 데이터 타입으로 메모리에 생성된 것
- 클래스
변수
변수의 종류
타입에 따른 분류
- Primitive Type variable(기본형) - 기본 8가지 type의 변수
- boolean, int, char, float, long, double, byte, short
- Reference Type variable(참조형) - 나머지 모든것
- Strin , Person 등
- Primitive Type variable(기본형) - 기본 8가지 type의 변수
선언 위치에 따른 분류
public class VariableTypes { int instanceVariable; // 인스턴스 멤버 변수 static int classVariable; // 클래스 멤버 변수 public static void main(String[] args) {// 파라미터 변수 int localVariable = 10; // 로컬 변수 for (int i = 0; i < 100; i++) { // 로컬 변수 System.out.println(i); } } }
인스턴스 멤버 변수의 특징
선언 위치 : 클래스 { }영역에 선언
String name;
변수의 생성 : 객체가 만들어질 때 객체 별로 생성됨
- 생성 메모리 영역 :heap
변수의 초기화 : 타입 별로 default초기화
변수에의 접근 : 객체 생성 후(메모리에 올린 후) 객체 이름(소속)으로 접근
- 객체를 만들 때마다 객체 별로 생성 → 객체마다 고유한 상태(변수 값) 유지
소멸 시점
- Garbage Collector에 의해 객체가 없어질 때,프로그래머가 명시적으로 소멸시킬 수 없음
클래스 멤버 변수의 특징
선언 위치 : 클래스 { }영역에 선언되며 static키워드를 붙임
static String scientificName = "Homo Sapiens";
변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록
- 개별 객체의 생성과 무관
- 모든 객체가 공유하게 됨(공유 변수라고도 불림)
변수의 초기화 : 타입 별로 default초기화
변수에의 접근 : 객체 생성과 무관하게 클래스 이름(소속)으로 접근
객체를 생성하고 객체 이름으로 접근도 가능하나 static에 부합한 표현은 아님
Person.scientificName = "클래스를 통한 변경";
소멸 시점
- 프로그램 종료 시
지역 변수 & 파라미터 변수
선언 위치 : 클래스 영역의 { } 이외의 모든 중괄호 안에 선언되는 변수들
메서드,생성자,초기화 블록
void call(String to){ // 파라미터 변수 String beep = "띠"; // 로컬 변수 for(int i=0; i<3; i++){ // 로컬 변수 System.out.println(beep); } }
변수의 생성 : 선언된 라인이 실행될 때
- 생성 메모리 영역 :thread별로 생성된 stack 영역
변수의 초기화 : 사용하기 전 명시적 초기화 필요
변수에 접근 : 외부에서는 접근이 불가하므로 소속 불필요
- 내부에서는 이름에 바로 접근
소멸 시점
- 선언된 영역인 {} 을 벗어날 때
메서드
메서드 정의와 필요성
메서드란?
- 현실의 객체가 하는 동작을 프로그래밍 화
- 어떤 작업을 수행하는 명령문의 집합
메서드를 작성하는 이유
- 반복적으로 사용되는 코드의 중복 방지
- 코드의 양을 줄일 수 있고 유지 보수가 용이함
메서드의 작성 방법
제한자 리턴_타입 메서드이름(타입 변수_명, 타입 변수_명…) // 선언부 { // do something // 구현부 }
선언부
- 리턴타입
- 호출 결과 호출한 곳으로 반환되는 값의 타입으로 아무것도 리턴하지 않을 경우 void
- 결과를 받을 때 묵시적 형 변환 적용
- 리턴 타입은 하나만 적용 가능
- 메서드 이름
- 메서드가 수행하는 작업을 쉽게 파악하도록 의미 있는 이름 사용
- 파라미터 목록
- 메서드 호출 시점에 넘겨줘야 하는 변수들로 넘겨줄 정보가 없을 경우 생략 가능
- 파라미터 전달 시 묵시적 형변환 적용
Variable arguments
- 메서드 선언 시 몇 개의 인자가 들어올 지 예상할 수 없을 경우 (또는 가변적)
- 배열 타입을 선언할 수 있으나 → 메서드 호출 전 배열을 생성,초기화 해야 하는 번거로움
- … 을 이용해 파라미터를 선언하면 호출 시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화
구현부
- 구현부는 중괄호 내에서 처리해야 하는 내용 즉 비즈니스 로직 작성
- 마지막에는 선언된 리턴 타입에 해당하는 값을 return문장과 함께 반환해야 함
- 값 반환 시에는 묵시적 형 변환 적용
- 리턴 타입이 void여서 반환할 값이 없을 경우 return문장 생략 가능
- 메서드 수행 도중 return문장을 만나거나 마지막 문장을 수행하는 경우 메서드는 종료
- 조건문을 이용해서 return할 경우 모든 조건에서 return필요
메서드 호출
- 메서드를 호출할 때는 메서드의 선언부에 맞춰 호출해야 함
- 메서드 이름 : 반드시 동일
- 파라미터 : 선언된 파라미터의 개수는 반드시 동일,타입은 promotion적용 가능
- 메서드 접근
- 멤버 변수와 마찬가지로 static또는 nonstatic상태를 구분해서 호출
- static member
- 소속: 클래스
- 접근 방법 : 같은 클래스는 바로 호출, 다른 클래스인 경우 클래스_이름.멤버_이름
- non static member(instance member)
- 소속: 객체
- 접근 방법 : 같은 클래스는 바로 호출, 다른 클래스인 경우 객체_이름.멤버_이름
class 멤버와 instance 멤버간의 참조와 호출
- 가장 중요한 것은 메모리에 있는가?
- 메모리에 있으면 호출 가능
- 메모리에 없으면 호출 불가
- staticmember → 언제나 메모리에 있음
- 클래스 로딩 시 자동 등록
- instancemember → 객체 생성 전에는 메모리에 없음
- 객체 생성 시 모든 일반 멤버들은 메모리에 생성
- 객체 즉 레퍼런스를 통해서 접근
메서드 호출 스택
- 스택(stack)
- First in Last out의 구조
- 메서드 호출 스택
- 각각의 메서드 호출시 메서드 동작을 위한 메모리 상자를 하나씩 할당
- 상자 내부에 메서드를 위한 파라미터 변수 등 로컬 변수 구성
- 각각의 메서드 호출시 메서드 동작을 위한 메모리 상자를 하나씩 할당
- A 메서드에서 새로운 메서드 B호출 시 B 실행을 위한 메모리 상자를 쌓음
- 언제나 맨 위에 있는 메모리 상자(B) 만 활성화
- 이때 A 메서드는 동작이 끝나지 않고 잠시 정지된 상태
- B가 리턴하게 되면 B를 위한 상자가 제거되며 메모리 반납
- 비로서 A가 최 상위가 돼서 다시 동작 재개
기본형 변수와 참조형 변수
- 메서드 호출 시 파라미터로 입력된 값을 복사해서 전달
메서드 오버로딩
- overloading: 동일한 기능을 수행하는 메서드의 추가 작성
- 일반적으로 메서드 이름은 기능별로 의미 있게 정함
- 동일한 기능을 여러 형태로 정의해야 한다면?
- 메서드 오버로딩의 장점
- 기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능
메서드 오버로딩 방법
- 메서드 이름은 동일
- 파라미터의 개수 또는 순서,타입이 달라야 할 것
- 파라미터가 같으면 중복 선언 오류
- 리턴 타입은 의미 없음
생성자
객체를 생성할 때 호출하는 메서드 비슷한 것
- new키워드와 함께 호출하는 것
- 일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리
작성 규칙
메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일
제한자 클래스_명 (타입 변수_명, 타입 변수_명…) //선언부 { // 멤버 변수 초기화 작업 // 구현부 }
생성자의 종류
- 기본 생성자(defaultconstructor)
- 그 동안 예제에서는 생성자를 작성하지 않았음
- 기본 생성자의 형태는 파라미터가 없고 구현부가 비어있는 형태
- 생성자 코드가 없으면 컴파일러가 기본 생성자 제공
- 그 동안 예제에서는 생성자를 작성하지 않았음
- 파라미터가 있는 생성자
- 생성자의 목적이 일반 멤버 변수의 초기화à 생성자 호출 시 값을 넘겨줘서 초기화
- 주의!파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않는다.
this.
- 참조 변수로써 객체 자신을 가리킴
- 참조변수를 통해 객체의 멤버에 접근했던 것처럼 this를 이용해 자신의 멤버에 접근 가능
- 용도
- 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 나타냄
- 명시적으로 멤버임을 나타낼 경우 사용
- this는 객체에 대한 참조
- 따라서 static영역에서 this사용 불가
this()
- 메서드와 마찬가지로 생성자도 오버로딩 가능
- 객체 생성 시 필요한 멤버변수만 초기화 진행 → 생성자 별 코드의 중복 발생
- 한 생성자에서 다른 생성자를 호출할 때 사용
- 반드시 첫 줄에서만 호출이 가능
'Programming > Java' 카테고리의 다른 글
JAVA - I/O 와 XML (0) | 2022.07.31 |
---|---|
JAVA - Exception Handling & Collection Framework (0) | 2022.07.31 |
JAVA - OOP(3) (0) | 2022.07.31 |
JAVA - OOP(2) (0) | 2022.07.31 |
JAVA - 기본, 배열, 다차원 배열 (0) | 2022.07.31 |