코드스테이츠_국비교육/[Section1]

11_객체지향 프로그래밍 기초_22.09.02

생각없이 해도 생각보다 좋다. 2022. 9. 2. 15:23

OOP, Object Oriented Programming

>객체, Object

: 실재하는 모든 대상


>객체지향이론

: "실제 세계는 이러한 객체들로 구성되어 있으며, 발생하는 모든 사건들은 이 객체들 간의 상호작용을 통해 발생한다"


>절차적 프로그래밍 방식

: 객체지향 프로그래밍과 반대되는 개념
: 일련의 명령어들의 나열을 통해 프로그래밍을 한다.


>객체지향 프로그래밍 방식

: 필요한 데이터가 모여있고, 상태와 행위를 가진 객체를 만듬
: 이러한 객체가 서로 상호작용하며 특정 기능을 구성하는 방식

 

>OOP의 장점

  • 현실 세계를 컴퓨터에 반영하기 적합함.
    : 실재하는 것의 기능과 속성을 객체로 반영하고, 이러한 객체들이 프로그램을 이루기 때문.
  • 객체를 재활용하기 좋음
    : 객체마다 완전하고 독립적인 기능을 갖기 때문에 필요한 곳에 다시 사용하기 유용하다.

>OOP의 단점

  • 절차적 프로그래밍 방식에 비해 느린 실행 속도

: 캡슐화와 격리 구조때문에 실행 속도가 느려짐

  • 필요한 메모리양 증가

 

클래스와 객체

>클래스

: 설계도 혹은 틀과 같은 역할
: 객체를 생성하는데 사용됨.
: 객체라는 붕어빵을 만들 수 있는 붕어빵 틀과 같은 역할을 하는 것이 클래스이다.


>인스턴스

: 특정 클래스를 통해 생성된 객체
: 붕어빵
: 클래스들을 인스턴스화 시켜서 활용함.
: 프로그램이 클래스 자체를 쓰진 못하고 인스턴스로 만들어줘야함! 붕어빵 틀은 못먹지

 

>클래스의 구조

  • 필드(field)
  • 메서드(method)
  • 생성자(constructor)
  • 이너 클래스(inner class)

// 클래스 멤버: 필드+메서드+이너 클래스


>필드(field)

: 클래스 내의 변수들
: 클래스의 속성(명칭)을 구현

 

>메서드(method)

: 클래스 내의 함수들
: 클래스의 기능을 구현

 

>생성자(constructor)

: 인스턴스(객체)를 생성하는 역할을 담당.
: 붕어빵1, 붕어빵2를 구분해주는 붕어빵 속재료

 

>이너 클래스(inner class)

: 클래스 내부에 존재하는 클래스


>객체(인스턴스)의 생성과 활용

-인스턴스 생성
(클래스명) (참조변수명) = new (생성자)();
: 생성자의 이름은 클래스명과 같다.

-인스턴스 생성 예시.
//가정: FishBread 클래스 존재
FishBread goldBun = new FishBread();

-인스턴스 활용
: 포인트 연산자(.) 사용

-인스턴스 활용 예시.
//class FishBread가 존재
//fishBread내의 stuff라는 필드값(변수) 존재
//fishBread내의 howToCook이라는 메서드 존재

FishBread redBean = new FishBread();
redBean.stuff //필드값 호출(인스턴스 변수)
redBean.howToCook //메서드 호출(인스턴스 메서드)

>객체의 생성 과정 해부

  • 참조변수의 사용?
    =>실제 데이터 값이 아닌 실제 데이터가 위치한 주소값을 가르킨다는 것을 의미
  • 실제 데이터가 위치한 장소는?
    =>힙 메모리에 위치. (즉, 참조변수는 힙 메모리 주소값을 가리킴.)
  • 힙 메모리에 저장되는 실제 데이터 값은?
    =>new 생성자(); 를 통해 생성된 객체(인스턴스)가 힙 메모리에 저장됨.

 

JVM 메모리 영역

>자바 가상머신 메모리 영역 구분

  • Class Area(=Method Area)
  • Stack Area
  • Heap Area

 

>Class Area(=Method Area)

: 한 번 할당되면 프로그램이 종료될 때까지 유지가 되는 애들이 저장됨.

: Class Area에 저장된 정보는 JVM이 종료될 때까지 유지됨.

: 클래스 정보, static 클래스 멤버 정보, 패키지 정보, 메소드 정보 등

 

>Stack Area

: 임시 저장의 영역

: 특정 지역을 벗어나면 사라지는 정보들이 저장되는 영역

: 지역변수, 매개변수 등

 

>Heap Area

: 인스턴스가 저장되는 영역

: new를 사용하여 객체를 만들때 인스턴스가 저장됨.

: 인스턴스에 저장되는 메서드와 static 변수는 실제 데이터가 아닌 참조값이 저장된다.

// 인스턴스를 스택 영역이 아닌 힙 영역에서 다루는 이유

// => 하나 이상의 참조 변수가 같은 인스턴스를 참조할 수 있기 때문에 함부로 없앨 수 없어서이다.

// => 대신, 참조하는 변수가 아무것도 없다고 JVM이 판단하면 인스턴스를 지운다.

// => 이렇게 조심히 지우는 것이 '가비지 컬렉션'이라는 것 같다. 알아만 두자

 

>참고 그림

 

그림 01. JVM 메모리 영역

필드

>변수의 종류

  • 클래스 변수
  • 인스턴스 변수
  • 지역 변수

>필드 변수 종류

  • 클래스 변수
  • 인스턴스 변수

>필드 변수 구분 기준

: static 키워드의 유무로 구분
: static이 있는 것이 클래스 변수

 

>인스턴스 변수

: 클래스에 선언된 일반 변수들을 의미함.
: 힙 영역에 저장
: 인스턴스가 생성될 때, 같이 생성
: 즉, 꼭 인스턴스를 생성해야만 호출이 가능함. (인스턴스명으로 호출)
: 값을 초기화 시키지 않으면 강제로 초키화됨. (에러 발생 X, 힙 영역의 특징)


>클래스 변수

: 클래스에 static으로 선언된 변수들을 의미함.
: 클래스 영역에 저장
: 클래스를 정의하면 생성됨.
: 즉, 인스턴스가 없어도 호출이 가능함. (클래스명으로 호출)
: 물론 인스턴스 생성 후 인스턴스로도 호출 가능.(하지만 클래스명 호출을 권장, 구분을 위해)
: 클래스 변수를 호출하여 새로운 값을 할당시키면 그대로 클래스에 저장됨. (때문에 모든 인스턴스에도 적용)


>지역 변수

: 클래스 변수, 인스턴스 변수가 아니면서, 메서드 내에 포함된 모든 변수
: 메서드 내에서만 사용 가능
: 스택 영역에 저장
: 메서드 종료시 소멸 (해당 메소드를 사용할 계획이 없다고 판단되면 JVM이 제거함)
: 직접 값을 초기화시켜야함. (스택 영역의 특징임)


>정적 멤버(static member)

: static으로 선언된 멤버(필드, 클래스, 이너 클래스)
: 모든 멤버 요소를 클래스명으로 호출할 수 있음.


메서드 오버로딩

 

>의미

: 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것.

 

>목적

: 메서드 사용자의 편리를 위해
: 같은 기능을 하는 하나의 메서드명으로 메서드를 호출하며 다양하게 활용할 수 있음.


>메서드 오버로딩 성립 조건

  1. 같은 메서드명으로 작성
  2.  매개변수의 개수 및 타입이 달라야함. (JVM이 다른 메서드로 인식해야함)


>주의

: 반환값을 다르게 하는 경우는 같은 메서드로 인식함.
: 즉, 같은 메서드이기 때문에 충돌이 발생해서 에러가 남.
: 오버로딩 조건을 지키면서 다른 반환값을 사용하는 메서드는 가능!