1.1. 객체지향언어의 역사
- 과학, 군사적 모의실험을 위해 컴퓨터를 이용한 가상세계를 구현하려는 노력으로부터 객체지향이론이 시작됨
- 1960년대 최초의 객체지향언어 Simula탄생
- 1980년댜 절차방식의 프로그래밍의 한계를 객체지향방식으로 극복하려고 노력함
- 1995년 말 Java탄생. 객체지향언어가 프로그래밍 언어의 주류가 됨
1.2. 객체지향언어의 특징
- 기존의 프로그래밍언어와 크게 다르지 않다.
- 기존의 프로그래밍 언어에 몇가지 규칙을 추가한 것일 뿐이다.
- 코드의 재사용성이 높다.
- 새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다.
- 코드의 관리가 쉬워졌다.
- 코드간의 관계를 맺어줌으로써 보다 적은 노력으로 코드변경이 가능하다.
- 신뢰성이 높은 프로그램의 개발을 가능하게 한다.
- 제어자와 메서드를 이용해서 데이터를 보호하고, 코드의 중복을 제거하여 코드의 불일치로 인한
오류를 방지할 수 있다.
2.1. 클래스와 객체의 정의와 용도
- 클래스의 정의 - 클래스란 객체를 정의해 놓은 것이다.
- 클래스의 용도 - 클래스는 객체를 생성하는데 사용된다.
- 객체의 정의 - 실제로 존재하는 것, 사물 또는 개념
- 객체의 용도 - 객체의 속성과 기능에 따라 다름
2.2 객체와 인스턴스
- 객체와 인스턴스는 비슷한 뜻이다.
- 객체는 인스턴스를 포함하는 일반적인 의미
- 인스턴스화
- 클래스로부터 인스턴스를 생성하는 것
2.3. 객체의 구성요소 - 속성과 기능
- 객체는 속성과 기능으로 이루어져 있다.
- 객체는 속성과 기능의 집합이며, 속성과 기능을 객체의 멤버(member, 구성요소)라고 한다.
- 속성은 변수로, 기능은 메서드로 정의한다.
- 클래스를 정의할 때 객체의 속성은 변수로, 기능은 메서드로 정의한다.
2.4. 인스턴스의 생성과 사용 - 1
- 인스턴스의 생성방법
2.4. 인스턴스의 생성과 사용 - 2
2.4. 인스턴스의 생성과 사용 - 3
2.4. 인스턴스의 생성과 사용 - 4
2.5. 클래스의 또 다른 정의
3. 변수와 메서드
3.1. 선언위치에 따른 변수의 종류
- 변수는 선언위치가 변수의 종류와 범위를 결정한다.
3.1. 선언위치에 따른 변수의 종류
- 인스턴스 변수(instance variable)
- 각 인스턴스의 개별적인 저장공간, 인스턴스마다 다른 값 저장가능
- 인스턴스 생성 후 참조변수.인스턴스변수명으로 접근
- 인스턴스를 새성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해 자동 제거됨
- 클래스 변수(class variable)
- 같은 클래스의 모든 인스턴스들이 공유하는 변수
- 인스턴스 생성없이 클래스이름.클래스변수명으로 접근
- 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸
- 지역변수(local variable)
- 메서드 내에 선언되며, 메서드의 종류와 함께 소멸
- 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸
3.2. 클래스변수와 인스턴스 변수
- 인스턴스변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만
클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
3.3. 메서드(method)
- 메서드란?
- 작업을 수행하기 위한 명령문의 집합
- 어떤 값을 입력받아서 처리하고 그 결과를 돌려준다.
- 입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.
- 메서드의 장점과 작성지침
- 반복적인 코드를 줄이고 코드의 관리가 용이하다.
- 반복적으로 수행되는 여러 문장을 메서드로 작성한다.
- 하나의 메서드는 한 가지 기능만 수행하도록 작성하는 것이 좋다.
- 관련된 여러 문장을 메서드로 작성한다.
- 메서드를 정의하는 방법 - 클래스 영역에만 정의할 수 있음
3.4. return문
- 메서드가 정상적으로 종료되는 경우
- 메서드의 블럭{}의 끝에 도달했을 때
- 메서드의 블럭{}을 수행 도중 return문을 만났을 때
- return문
- 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
3.4. return문 - 주의사항
- 반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다.
- return문의 개수는 최소화하는 것이 좋다.
3.5. 메서드의 호출
- 메서드의 호출방법
3.6. JVM의 메모리 구조
- 메서드 영역(Method Area)
- 클래스 정보와 클래스변수가 저장되는 곳
- 호출스택(Call Stack)
- 메서드의 작업공간 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 할당받고
메서드가 종료되면 사용하던 메모리를 반환한다.
- 힙(Heap)
- 인스턴스가 생성되는 공간 new연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성된다.
3.6. JVM의 메모리구조 - 호출스택
- 호출스택의 특징
- 메서드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다.
- 메서드가 수행을 마치면 사용했던 메모리를 반환한다.
- 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드다.
3.7. 기본형 매개변수와 참조형 매개변수
- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.
- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.
3.8. 재귀호출
- 재귀호출이란?
- 메서드 내에서 자기자신을 반복적으로 호출하는 것
- 재귀호출은 반복문으로 바꿀 수 있으며 반복문보다 성능이 나쁨
- 이해하기 쉽고 간결한 코드를 작성할 수 있다.
- 재귀호출의 예
- 팩토리얼, 제곱, 트리운행, 폴더목록표시 등
3.9. 클래스메서드(static메서드)와 인스턴스메서드
- 인스턴스 매세드
- 인스턴스 생성 후, 참조변수.메서드이름()으로 호출
- 인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스변수 사용가능
- 클래스메서드(static메서드)
- 객체생성없이 클래스이름.메서드이름()으로 호출
- 인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스변수 사용불가
- 메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
3.10. 멤버간의 참조와 호출 - 메서드 호출
- 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다.
그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.
3.10. 멤버간의 참조와 호출 - 변수의 접근
- 같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수 있다.
그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.
4. 메서드 오버로딩
4.1. 메서드 오버로딩(method overloading)이란?
- 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩, 간단히 오버로딩이라고 한다.
- overload - vt. 과적하다. 부담을 많이 지우다.
4.2. 오버로딩의 조건
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
- 리턴타입은 오버로딩을 구현하는 데 아무런 영향을 주지 못한다.
4.3. 오버로딩의 예
- System.out.println메서드
- 다양하게 오버로딩된 메서드를 제공함으로써 모든 변수를 출력할 수 있도록 설계
- 매개변수의 이름이 다른 것은 오버로딩이 아니다.
- 리턴타입은 오버로딩의 성립조건이 아니다.
- 매개변수의 타입이 다르므로 오버로딩이 성립한다.
- 오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능수행
5. 생성자
5.1. 생성자(constructor)란?
- 생성자란?
- 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
- 인스턴스 변수의 초기화 또는 인스턴스 생성 시 수행할 작업에 사용
- 몇가지 조건을 제외하고는 메서드와 같다.
- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
- 인스턴스 초기화 : 인스턴스 변수에 적절한 값을 저장하는 것
5.2. 생성자의 조건
- 생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴값이 없다.
- 하지만 void를 쓰지 않는다.
5.3. 기본 생성자(default constructor)
- 기본 생성자란?
- 매개변수가 없는 생성자
- 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.
- 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.
5.4. 매개변수가 있는 생성자
5.5. 생성자에서 다른 생성자 호출하기 - this()
- this() : 생성자, 같은 클래스의 다른 생성자를 호출할때 사용
다른 생성자 호출은 생성자의 첫 문장에서만 가능
5.6. 참조변수 this
- this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
5.7. 생성자를 이용한 인스턴스의 복사
- 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.
- 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들의 값을 복사한다.
- 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.
6. 변수의 초기화
6.1. 변수의 초기화
- 변수를 선언하고 처음으로 값ㅇ르 저장하는 것
- 멤버변수(인스턴스변수,클래스변수)와 배열은 각 타입의 기본값으로 자동초기화되므로 초기화를 생략가능
- 지역변수는 사용전에 반드시 초기화를 해주어야한다.
6.2. 멤버변수의 초기화
- 멤버변수의 초기화 방법
6.3. 초기화 블럭
- 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용되며 클래스가 로딩될 때 실행된다.
- 인스턴스 초기화 블럭 : 생성자에서 공통적으로 수행되는 작업에 사용되며 인스턴스가 생성될 때 마다
생성자 보다 먼저 실행된다.
6.4. 멤버변수의 초기화 시기와 순서
- 클래스변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번
- 인스턴스변수 초기화 시점 : 인스턴스가 생설될 때 마다
'프로그램 이론 > JAVA' 카테고리의 다른 글
[JAVA]예외처리 (0) | 2018.05.24 |
---|---|
[JAVA]객체지향언어의 개넘 - 2 (0) | 2018.05.23 |
[JAVA]배열(Array) (0) | 2018.05.20 |
[JAVA]조건문과 반복문 (0) | 2018.05.20 |
[JAVA]연산자(Operator) (0) | 2018.05.18 |