객체지향 프로그래밍이란? Object Oriented Programming
주변의 많은 것들을 객체화해서 프로그래밍 하는 것
객체지향 프로그래밍의 장점
블록 형태의 모듈화된 프로그래밍
신뢰성 높은 프로그래밍 가능
추가/수정/삭제가 용이
재 사용성이 높음
Class vs Object
현실의 객체가 갖는 속성과 기능은 추상화(abstraction) 되어 클래스에 정의됨
클래스는 구체화되어 프로그램의 객체(instance, object)가 됨
객체는 그 자체가 사물임, 하지만 프로그래밍에서는 그 자체가 Data임
객체 생성과 메모리
Class area : 클래스 원형 로딩
- Field 정보
- Method 정보
- 타입 정보
- 상수 풀
Method stack : 메서드의 실행 공간
Thread 별로 별도 관리
메서드 호출 순서대로 쌓이는 구조
메서드 프레임에 로컬변수도 쌓이는 구조
로컬변수는 선언된 영역을 벗어나면 삭제
Heap : 객체를 저장하기 위한 영역
Thread에 의해 공유
생성된 객체는 프로그래머가 삭제할 수 없고 GC만이 제어 가능
메모리 할당 형태
클래스영역 스택 영역 힙 영역
클래스영역 | 스택 영역 | 힙 영역 |
Class가 지정되있는 부분 | 클래스로 만들어진 객체 | 데이터 값들이 저장되는 위치 |
Person - name, age, isHungry - eat ( ), work ( ) PersonTest - main ( ) |
Person person2 [ 0x300 ] Person person1 [ 0x100 ] |
[ 0x300 ] [ 0x400 ] ( name ) → [ 0x400 ] “임꺽정” 0 ( age ) true ( isHungry ) [ 0x100 ] [ 0x200 ] ( name ) → [ 0x200 ] “홍길동” 0 ( age ) false ( isHungry) |
Person |
인스턴스 멤버 변수의 특징
선언 위치 : 클래스 { } 영역에 선언
변수의 생성 : 객체가 만들어진 때 객체 별로 생성됨
생성 메모리 영역 : heap
변수의 초기화 : 타입 별 default로 초기화
변수에서의 접근 : 객체 생성 후 객체 이름으로 접근, ‘.’을 이용하여 접근 ex) p1.name = “이름”;
소멸 시점 : Garbage Collection에 의해 객체가 없어질 때
클래스 멤버 변수의 특징
선언 위치 : 클래스 { } 영역에 선언되며 static 키워드를 붙임
변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록
Static은 객체 생성과 무관하게 메모리에 할당됨
변수의 초기화 : 타입 별 default로 초기화
변수에서의 접근 : 객체 생성과 무관하게 클래스 이름으로 접근
소멸 시점 : 프로그램 종료 시
지역 변수 & 파라미터 변수
선언 위치 : 클래스 영역의 { } 이외에 모든 중괄호 안에 선언되는 변수들
변수의 생성 : 선언된 라인이 실행될 때
생성 메모리 영역 : thread 별로 생성된 stack 영역
변수의 초기화 : 사용하기 전 명시적 초기화 필요
변수에서의 접근 : 외부에서는 접근이 불가
소멸 시점 : 선언된 영역인 { } 을 벗어날 때
메서드
메서드란 : 현실의 객체가 하는 동작을 프로그래밍화
메서드의 존재 이유
반복적으로 사용되는 코드의 중복 방지
코드의 양을 줄일 수 있고 유지 보수가 용이함
메서드의 작성 방법
Modifier Return_Value_Type Method_Name (Argument_type argument variable)
제한자 리턴타입 메서드이름 ( 타입 변수명, 타입 변수명 .....)
선언부
리턴 타입 : 호출한 곳으로 호출 결과를 반환하는 값의 형식, print만 할시 void 사용
메서드 이름 : 호출할 함수의 이름을 지정 ( 의미 있는 이름을 사용)
파라미터 목록 : 메서드 호출 시점에 넘기는 변수들
Variable arguments : 몇개의 인자가 들어올 지 예상 할 수 없거나 가변적일 경우
구현부
중괄호 내에서 처리해야 하는 내용. 즉, 로직을 작성
마지막에는 선언된 리턴 타입에 대항하는 값을 return 해야함
메서드 호출
메서드를 호출할때는 메서드의 선언부에 맞춰 호출해야 함
메서드 접근시 static 과 non static 상태를 구분해서 호출
메서드 호출 스택
각각의 메서드 호출시 메서드 동작을 위한 메모리 상자를 하나씩 할당
A 메서드에서 새로운 메서드 B호출 시 B 실행을 위한 메모리 상자를 쌓음
Java는 call by value → 값을 복사해서 argument로 넘김
메서드 오버로딩
overloading : 동일한 기능을 수행하는 메서드를 추가 작성
Argument형태가 달라지면 동일한 메서드 이름 사용 가능 : 중복코드에 대한 효율적 관리
생성자
객체를 생성할 때 호출하는 명령어
Person p1 = new Person ( );
메서드와 비슷하지만 리턴 타입이 없고, 이름은 클래스 이름과 동일
제한자 클래스명 ( 타입 변수명, 타입 변수명 .....)
'SSAFY > Daily' 카테고리의 다른 글
20220126 JAVA I/O & Stream (0) | 2022.02.04 |
---|---|
20220125 JAVA 예외처리 (0) | 2022.02.04 |
20220124 JAVA 추상클래스 (0) | 2022.02.04 |
20220120 JAVA 생성자 및 상속 (0) | 2022.01.20 |
20220117 JAVA 기초수업 (0) | 2022.01.17 |
댓글