03. 함수와 메서드
객체 지향 프로그램을 할 떄는?
객체를 정의 하고 / 각 개체의 속성을 멤버 변수로 역할을 메서드로 구현하고 /
각 객체간의 협력을 구현합니다.
클래스 코딩하기!
클래스는 대문자로 시작하는 것이 좋음 / java 파일 하나에 클래스는 여러 개가 있을 수 있지만, public 클래스는 하나이고, public 클래스와 .java 파일의 이름은 동일함
camel notation 방식으로 명명
함수(function)
하나의 기능을 수행하는 일련의 코드
구현된(정의된) 함수는 호출하여 사용하고 호출된 함수는 기능이 끝나면 제어가 반환됨.
함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용할 수 있음.
함수의 구성 : 함수의 이름 / 매개 변수 / 반환 값(void, int, ~) / 함수 몸체(body)
함수 호출과 스택 메모리
- 스택 : 함수가 호출될 때 지역 변수들이 사용하는 메모리
- 함수의 수행이 끝나면 자동으로 반환 되는 메모리
지역 변수 : 블럭 안에서 정의되는 변수
-----
04. 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다.
메서드(method) : 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수
멤버 함수(member function)이라고도 함.
메서드를 구현함으로써 객체의 기능이 구현됨.
메서드의 이름은 그 객체를 사용하는 객체(클라이언트)에 맞게 짓는 것이 좋음.
ex) getStudentName()
-----
05. 인스턴스 생성과 힙 메모리(heap memory)
- 인스턴스(instance)
클래스는 객체의 속성을 정의하고, 기능을 구현하여 만들어 놓은 코드 상태.
실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨.
new 키워드를 사용하여 인스턴스 생성
- 힙 메모리
생성된 인스턴스는 동적 메모리(heap memory)에 할당됨.
C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함(free나 delete)
자바에서는 Gabage Collector가 주기적으로 사용하지 않는 메모리를 수거.
하나의 클래스로부터 여러개의 인스턴스가 생성되고, 각각 다른 메모리 주소를 갖게 됨.
클래스 : 객체를 프로그래밍 하기 위해 코드로 정의해 놓은 상태.
객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스.
인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태.
멤버 변수 : 클래스의 속성, 특성
메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수(스택 영역)
참조 값 : 생성된 인스턴스의 메모리 주소 값(힙 영역)
06. 생성자(constructor)에 대해 알아봅시다
생성자
생성자는 반환 값이 없고, 클래스의 이름과 동일
객체를 생성하기 위해 new 키워드와 함께 사용.
-> Student st1 = new Student();
객체가 생성될 떄 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출함.
대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private으로 선언되는 경우도 있음.
기본 생성자(default constructor)
클래스에는 반드시 적어도 하나 이상의 생성자가 존재
생성자를 구현하지 않아도 new 키워드와 함꼐 생성자를 호출할 수 있음.
클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어 줌.
-> public Student(){}
07. 여러가지 생성자를 정의하는 생성자 오버로딩(overloading)
생성자 정의하기
- 생성자를 구현해서 사용할 수 있음.
- 클래스에서 생성자를 따로 구현하면 기본 생성자(default constructor)는 제공되지 않음.
- 생성자를 호출하는 코드(client 코드)에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있음.
08. 객체 생성 복습 : https://github.com/pg0863/FC_Java
GitHub - pg0863/FC_Java: 패스트캠퍼스 자바
패스트캠퍼스 자바. Contribute to pg0863/FC_Java development by creating an account on GitHub.
github.com
09. 참조 자료형 변수
- 변수의 자료형
1. 기본 자료형 ; int, long, float, double 등
2. 참조 자료형 : String, Date, Student 등
- 클래스형으로 변수를 선언
- 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다름
- 참조 자료형을 사용할 때는 해당 변수에 대해 생성해야 함.
(String 클래스는 예외적으로 생성하지 않고 사용 가능)
11. 캡슐화(encapsulation)
- 꼭 필요한 정보와 기능만 외부에 오픈함
- 대부분의 [멤버 변수와 메서드를 감추고] 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현하게 함.
- 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화한다.
12. 객체 자신을 가리키는 this
tihs가 하는 일
- 인스턴스 자신의 메모리를 가리킴.
- 생성자에서 또 다른 생성자를 호출할 때 사용.
- 자신의 주소(참조값)을 반환 함.
생성된 인스턴스 메모리의 주소를 가짐!
생성자에서 다른 생성자를 호출하는 this
-클래스에서 생성자가 여러 개인 경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음.
- 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음.
자신의 주소를 반환하는 this
13. 객체 간의 협력(collabration)
객체 지향 프로그래밍에서의 협력
- 객체 지향 프로그램에서 객체 간에는 협력이 이루어짐.
- 협력을 위해서는 필요한 메세지를 전송하고 이를 처리하는 기능이 구현되어야 함.
- 매개 변수로 객체가 전달되는 경우가 발생.
16. 여러 인스턴스에서 공통으로 사용하는 변수를 선언하자 - static 변수
program을 실행하면 memory 영역에 올라가게 됨.
이 memory 영역에 올라갔을 때의 상태를 process 라고 함.
이 process는 thread의 상태로 되어서 돌아가게 된다.
인스턴스가 생성될 때마다 사용하는 메모리는 heap 메모리(동적 메모리)
인스턴스가 사라지는 순간 GC(garbage collector)에 의해 회수된다.
static 변수는 로딩되는 순간 Data영역에 잡히고, 메모리에서 unload되어야 없어짐.
- static 변수는 클래스이름을 참조해서 인스턴스 생성 없이 바로 사용 가능하다.
- 인스턴스1에서 static 변수 A의 값을 변경하면, 인스턴스2 에서도 같이 변경된다.
(static 변수는 인스턴스에서 공통으로 사용하는 영역임을 알 수 있음.)
인스턴스1과 인스턴스2는 데이터 영역의 static 변수 A를 함께 참조한다.
데이터영역:serialNum(1001)
스택 메모리 : studentLee / studentKim
힙 메모리 : studentLee 인스턴스 / sutdentSon 인스턴스
- private static 형식으로 선언하여 get메소드를 이용해서 값을 가져올 수 있다.
- static 메소드(클래스 메소드)에서는 인스턴스 변수를 사용할 수 없다.
* 인스턴스 생성과 무관하게 클래스 이름으로 호출할 수 있다.
* 인스턴스 생성 전에도 호출될 수 있으므로 static 메소드 내부에서는 인스턴스 변수 사용 X
- 변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다름.
- 지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다름.
- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않음.
- 클래스 내부의 여러 메소드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음.
- 그러나 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당 됨.
- 상황에 적절하게 변수를 사용해야 함.
18. static 응용 - 싱글턴 패턴(singleton pattern)
싱글턴 패턴이란?
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴.
- static 변수, 메소드를 활용하여 구현할 수 있음.
Singleton : 클래스 이름
instance : 변수
Singleton : 생성자
getInstance : 메소드
- : private
+ : public
19. 싱글턴 패턴 예제
자동차 공장(유일한 객체).
이 공장에서 생산되는 자동차는 자동차는 제작될 때마다 고유 번호가 부여된다.
자동차 번호가 10001부터 시작되어 자동차가 생산될 때마다 10002, 10003 이렇게 번호가 붙도록
자동차 공장 클래스, 자동차 클래스 구현.
20. 자료를 순차적으로 한꺼번에 관리하는 방법 - 배열(array)
배열이란?
- 동일한 자료형의 순차적 자료 구조
- 인덱스 연산자[]를 이용하여 빠른 참조가 가능
- 물리적 위치와 논리적 위치가 동일
- 배열의 순서는 0부터 시작
- 자바에서는 객체 배열을 구현한 ArrayList를 많이 활용함
배열 선언과 초기화
- 배열 선언하기
int[] arr1 = new int[10];
int arr2[] = new int[10];
- 배열 초기화하기
배열을 선언과 동시에 자료형에 따라 초기화 됨(정수는 0, 실수는 0.0, 객체는 null)
필요에 따라 초기값을 지정할 수 있음.
int[] numbers = new int[] {10, 20, 30}; // 개수 생략해야 함
int[] numbers = {10, 20, 30}; // new int[] 생략 가능
int[] ids;
ids = new int[] {10,20,30}; // 선언 후 배열을 생성하는 경우는 new int 생략할 수 없음.
배열 사용하기
- [] 인덱스 연산자 활용 - 배열 요소가 저장된 메모리의 위치를 연산하여 찾아 줌
- 배열을 이용해 합을 구하기
배열의 길이와 요소의 개수는 동일하지 않다.
- 배열을 선언하면 개수만큼 메모리가 할당되지만, 실제 요소(데이터)가 없는 경우도 있음.
- 배열의 length 속성은 배열의 개수를 반환해주기 떄문에 요소의 개수와는 다름.
- length를 활용하여 오류가 나는 경우
문자형 배열
21. 객체 배열 사용하기
- 객체 배열 선언과 구현
기본 자료형 배열은 선언과 동시에 배열의 크기만큼 메모리가 할당되지만,
객체 배열의 경우엔 요소가 되는 객체가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null)
각 요소 객체는 생성하여 저장해야 함.
객체 배열 복사하기
- System.arrayCopy(src, srcPos, dest, destPos, length) 자바에서 제공되는 배열 복사 메서드
- 얕은 복사
객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정 됨.
즉, 두 배열이 같은 객체를 가리킴.
서로 다른 객체를 가리키게 할 경우, 따로 만들어주면 된다.
22. 2차원 배열 사용하기
다차원 배열
- 이차원 이상으로 구현된 배열
- 평면(이차원 배열)이나 공간(삼차원 배열)을 활용한 프로그램 구현
이차원 배열 예제
int[][] arr1 = new int[2][3];
int[][] arr2 = { {1,2,3}, {4,5,6,7} };
- ArrayList를 활용한 간단한 예제 -
- ArrayList를 활용한 간단한 성적 산출 프로그램 -
'FastCampus 강의 > 한번에 끝내는 Java&Spring 웹 개발' 카테고리의 다른 글
Ch03. 객체 지향 핵심 (0) | 2021.12.07 |
---|