JAVA/객체지향프로그래밍

OOP - 1

JINGMONG 2021. 12. 6. 20:43

1. 객체지향 프로그래밍이란?

Object Oriented Programming

 

객체란?

주체가 아닌 것, 주체가 활용하는것 우리 주변에 있는 모든 것으로 프로그래밍의 대상

 

객체지향 프로그래밍

주변의 많은 것들을 객체화 해서 프로그래밍 하는 것

 

객체지향 프로그래밍의 장점

블록 형태의 모듈화된 프로그래밍

신뢰성 높은 프로그래밍이 가능하다 추가/수정/삭제가 용이하다 재 사용성이 높다

 

2. 클래스

클래스

객체를 정의해 놓은 것, 즉 객체의 설계도 , 틀

클래스는 직접 사용할 수 없고 직접 사용되는 개체를 만들기 위한 틀을 제공할 뿐

 

객체

클래스를 데이터 타입으로 메모리에 생성된 것 객체들은 모두 클래스에서 선언된 속성을 가짐 객체 별로 다른 상태 값을 가짐

 

객체 생성과 메모리

JVM의 메모리 구조

클래스 영역(클래스 원형 로딩)

  • Field 정보
  • Method 정보
  • 타입 정보
  • 상수 풀

method stack(메소드들의 실행 공간)

  • thread 별로 별도 관리
  • 메서드 호출 순서대로 쌓이는 구조
  • 메서드 프레임에 로컬변수도 쌓이는 구조
  • 로컬 변수는 선언된 영역을 벗어나면 삭제

heap(객체를 저장하기 위한 영역)

  • thread에 의해 공유
  • 생성된 객체는 프로그래머가 삭제할 수 없고 GC만이 제어 가능

 

변수의 종류

선언 위치에 따른 분류

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);
		}
	}
}

 

인스턴스 멤버 변수의 특징

선언 위치 : 클래스 {}영역에 선언

public class Person {
	static String scientificName = "Homo Sapiens"; // 클래스 멤버변수
	String name; // 인스턴스 멤버변수
}

변수의 생성 : 객체가 만들어질 때 객체 별로 생성됨

생성 메모리 영역 : heap

변수의 초기화 : 타입 별로 default 초기화

변수에의 접근 : 객체 생성 후 객체 이름으로 접근

객체를 만들 때마다 객체별로 생성 → 객체마다 고유한 상태 유지

소멸 시점

가비지 컬랙션에 의해 객체가 없어질 때, 프로그래머가 명시적으로 소멸시킬 수 없음

 

클래스 멤버 변수의 특징

선언 위치 : 클래스 {}영역에 선언되며 static 키워드를 붙임

변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록

개별 객체의 생성과 무관

모든 객체가 공유하게 됨(공유 변수라고도 불림)

변수의 초기화 : 타입 별로 default 초기화

변수에의 접근 : 객체 생성과 무관하게 클래스 이름으로 접근

Person p = new Person();
p.scientificName = "객체를 통한 변경";

Person.scientificName = "클래스를 통한 변경";

소멸 시점

프로그램 종료 시

 

지역 변수 & 파라미터 변수

선언 위치 : 클래스 영역의 {} 이외의 모든 중괄호 안에 선언되는 변수들

메서드, 생성자, 초기화 블럭

void call(String to) {       // 파라미터 변수
	String beep = "띠";        // 로컬 변수

	for (int i = 0 ; i < 3 ; i++) { // 로컬 변수
		sysout(beep);
	}
}

변수의 생성 : 선언된 라인이 실행될 때

생성 메모리 영역 : thread 별로 생성된 stack 영역

변수의 초기화 : 사용하기 전 명시적 초기화 필요

변수에의 접근 : 외부에서는 접근이 불가능하므로 소속 불필요

내부에서는 이름에 바로 접근

소멸 시점 : 선언된 영역인 {}을 벗어날 때 ****

 

3. 메서드

메서드정의와 필요성

메서드

현실의 객체가 하는 동작을 프로그래밍 화

어떤 작업을 수행하는 명령문의 집합

 

메서드 작성을 하는 이유

반복적으로 사용되는 코드의 중복방지

코드의 양을 줄일 수 있고 유지 보수가 용이함

 

메서드 작성 방법

제한자 리턴_타입 메서드이름(타입 변수_명, 타입 변수_명...)

{ //do something }

어떤 값을 입력 받아서 → 파라미터 (생략가능)

작업을 진행하고 → 실행문장

결과를 돌려주는 역할 → 리턴 값(생략가능)

 

class 멤버와 instance 멤버간 참조와 호출

가장 중요한 것은 메모리에 있는가?

메모리에 있다면 호출가능

메모리에 없다면 호출 불가

static member → 언제나 메모리에 있음

클래스 로딩시 자동 등록

instnace member → 객체 생성 전에는 메모리에 없음

객체 생성 시 모든 일반 멤버들은 메모리에 생성

객체 즉 레퍼런스를 통해서 접근

 

메서드 호출 스택

stack

FILO구조

메서드 호출 스택

각 메서드 호출 시 마다 메서드 동작을 위한 메모리 상자를 하나씩 할당

상자 내부에 메서드를 위한 파라미터 변수 등 로컬 변수 구성

A메서드에서 새로운 메서드 B호출 시 B실행을 위한 메모리 상자를 쌓음

언제나 맨 위에 있는 메로리 상자만 활성화

이때 A메서드는 동작이 끝나지 않고 잠시 정지된 상태

B가 리넡하게 되면 B를 위한 상자가 제거되며 메모리 반납

비로서 A가 최 상위가 돼서 다시 동작 재개

 

메서드 오버로딩

overloding : 동일한 기능을 수행하는 메서드의 추가작성

일반적으로 메서드 이름은 기능별로 의미 있게 정함

동일한 기능을 여러 형태로 정의할 수 있게 해줌

 

장점

기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능

 

방법

메서드 이름은 동일

파리미터의 개수 또는 순서, 타입이 달라야 할 것

→ 파라미터가 같으면 중복 선언 오류

리턴 타입은 의미 없음

	int add(int a, int b) {
		return a+ b;
	}
	long add(int a, int b) { // 타입은 다르지만 파라미터의 타입과 개수가 일치해서 중복 선언 오류
		return a+b;
	}
	long add(long a, int b) {
		return a+b;
	}
	long add(int a, long a) {
		return a+b;
	}

 

4. 생성자

객체를 생성할 때 호출하는 메서드 비슷한 것

new 키워드와 함께 호출하는 것

일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리

 

작성 규칙

메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일

제한자 클래스_명(타입 변수_명, 타입 변수_명 ...) 선언부

{ 구현부 //멤버변수 초기화 작업 }

 

생성자의 종류

기본생성자

기본 생성자의 형태는 파라미터가 없고 구현부가 비어있는 형태

생성자 코드가 없으면 컴파일러가 기본 생성자 제공

 

파라미터가 있는 생성자

생성자의 목적이 일반 멤버 변수의 초기화 → 생성자 호출 시 값을 넘겨줘서 초기화

주의! 파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않는다.

 

5. this.

this

참조 변수로써 객체 자신을 가리킴

참조변수를 통해 객체의 멤버에 접근했던 것처럼 this를 이용해 자신의 멤버에 접근 가능

 

용도

로컬 변수와 멤버 변수의 이름이 동일한 경우 멤버 변수임을 명시적으로 나타냄

명시적으로 멤버임을 나타낼 경우 사용

 

this는 객체에 대한 참조

따라서 static 영역에서 this 사용 불가

this()

메서드와 마찬가지로 생성자도 오버로딩 가능

객체 생성 시 필요한 멤버변수만 초기화 진행 → 생성자 별 코드의 중복 발생

한 생성자에서 다른 생성자를 호출할 때 사용

반드시 첫 줄에서만 호출이 가능

'JAVA > 객체지향프로그래밍' 카테고리의 다른 글

Collection Framework  (0) 2021.12.06
Exception Handling  (0) 2021.12.06
OOP - 3  (0) 2021.12.06
OOP - 2  (0) 2021.12.06