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이 판단하면 인스턴스를 지운다.
// => 이렇게 조심히 지우는 것이 '가비지 컬렉션'이라는 것 같다. 알아만 두자
>참고 그림
필드
>변수의 종류
- 클래스 변수
- 인스턴스 변수
- 지역 변수
>필드 변수 종류
- 클래스 변수
- 인스턴스 변수
>필드 변수 구분 기준
: static 키워드의 유무로 구분
: static이 있는 것이 클래스 변수
>인스턴스 변수
: 클래스에 선언된 일반 변수들을 의미함.
: 힙 영역에 저장
: 인스턴스가 생성될 때, 같이 생성
: 즉, 꼭 인스턴스를 생성해야만 호출이 가능함. (인스턴스명으로 호출)
: 값을 초기화 시키지 않으면 강제로 초키화됨. (에러 발생 X, 힙 영역의 특징)
>클래스 변수
: 클래스에 static으로 선언된 변수들을 의미함.
: 클래스 영역에 저장
: 클래스를 정의하면 생성됨.
: 즉, 인스턴스가 없어도 호출이 가능함. (클래스명으로 호출)
: 물론 인스턴스 생성 후 인스턴스로도 호출 가능.(하지만 클래스명 호출을 권장, 구분을 위해)
: 클래스 변수를 호출하여 새로운 값을 할당시키면 그대로 클래스에 저장됨. (때문에 모든 인스턴스에도 적용)
>지역 변수
: 클래스 변수, 인스턴스 변수가 아니면서, 메서드 내에 포함된 모든 변수
: 메서드 내에서만 사용 가능
: 스택 영역에 저장
: 메서드 종료시 소멸 (해당 메소드를 사용할 계획이 없다고 판단되면 JVM이 제거함)
: 직접 값을 초기화시켜야함. (스택 영역의 특징임)
>정적 멤버(static member)
: static으로 선언된 멤버(필드, 클래스, 이너 클래스)
: 모든 멤버 요소를 클래스명으로 호출할 수 있음.
메서드 오버로딩
>의미
: 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것.
>목적
: 메서드 사용자의 편리를 위해
: 같은 기능을 하는 하나의 메서드명으로 메서드를 호출하며 다양하게 활용할 수 있음.
>메서드 오버로딩 성립 조건
- 같은 메서드명으로 작성
- 매개변수의 개수 및 타입이 달라야함. (JVM이 다른 메서드로 인식해야함)
>주의
: 반환값을 다르게 하는 경우는 같은 메서드로 인식함.
: 즉, 같은 메서드이기 때문에 충돌이 발생해서 에러가 남.
: 오버로딩 조건을 지키면서 다른 반환값을 사용하는 메서드는 가능!
'코드스테이츠_국비교육 > [Section1]' 카테고리의 다른 글
12_객체지향 프로그래밍 기초2(이너 클래스)_22.09.05 (0) | 2022.09.05 |
---|---|
12_객체지향 프로그래밍 기초2(생성자)_22.09.05 (0) | 2022.09.04 |
10_배열_22.09.01 (0) | 2022.09.02 |
09_제어문(조건문, 반복문)_22.08.31 (0) | 2022.09.02 |
08_Java의 기초.part(java, 변수, 타입, 문자열, 연산자, 콘솔 입출력)_22.08.30 (0) | 2022.08.30 |