1. 객체지향언어
- 역사
- 기본 개념 : 실제 세계는 사물(객체)로 이루어져 있고, 사물간의 상호작용으로 모든 사건이 발생한다
- 객체지향
- 코드의 재사용성이 높고 유지보수 편함
- 처음에는 기능 구현에 초점을 맞추고, 객체지향적으로 바꾸는 게 좋음
2. 클래스와 객체
- 클래스와 객체의 정의와 용도
- 클래스 : 설계도 (TV 설계도)
- 객체 : 실제 사물 (TV)
- 객체와 인스턴스
- 클래스 → 객체 과정을 인스턴스화(instantiate) 라고 함
- 클래스로부터 만들어진 객체를 인스턴스(instance)라고 함
- 객체의 구성 요소 - 속성과 기능
- 객체는 속성과 기능으로 구성
- 객체가 가지고 있는 속성과 기능을 객체의 멤버라고 함
- 속성 : 멤버변수(member variable), 특성(attribute), 상태(state)
- 기능 : 메서드(method), 함수(function), 행위(behavior)
- 인스턴스의 생성과 사용
- 클래스 타입의 참조 변수를 선언하고, 그 참조 변수에 new를 통해 인스턴스를 넣는다.
- 참조 변수의 타입과 인스턴스의 타입이 일치해야 한다.
- 객체 배열
- 객체 배열은 참조변수를 하나로 묶은 참조 변수 배열임
- 반드시 개별적으로 인스턴스 생성해줘야함
- 클래스의 또 다른 정의
- 변수 : 하나의 데이터를 저장할 수 있는 공간
- 배열 - 같은 종류 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
- 구조체 - 다른 종류 여러 데이터를 하나의 집합으로 저장
- 클래스 - 데이터 + 함수 (구조체 + 함수)
3. 변수와 메서드
- 선언위치에 따른 변수의 종류
- 클래스 변수 (class variable) : static이 붙은 멤버 변수 → 클래스가 메모리에 올라갈 때 생성 (공유 변수)
- 인스턴스 변수 (instance variable) : 클래스 영역에 선언된 멤버 변수 → 인스턴스 생성시
- 지역 변수 (local variable) : 메서드, 생성자, 초기화 블럭 내부 → 변수 선언문 실행 시
- 클래스변수와 인스턴스변수
- 자신만의 특징이 드러나는 곳에는 인스턴스 변수를, 해당 클래스에 공통적으로 나타나는 곳에는 클래스 변수를 사용
- 클래스 변수는 객체 생성 없이 클래스이름.클래스변수 로 직접 사용 가능
- 메서드
- 블랙박스 → 내부 동작을 알 필요 없이 사용 가능함
- 높은 재사용성
- 중복 코드 제거
- 프로그램의 구조화 → 내용 없는 메서드를 선언하고 하나씩 설계 가능함
- 메서드의 선언과 구현
- 메서드 선언부 (method declaration)
- 매개변수 선언(parameter declaration) : 매개변수를 받는 것(입력)
- 메서드 이름
- 반환 타입 : 반환 값이 없는 경우 void
- 메서드의 구현부
- void 리턴이 아닌 경우, return문이 반드시 포함되어야 함
- 반환 타입이 일치하거나 자동 형변환이 가능한 것이어야 함
- 메서드의 호출
- 인자(argument) : 메서드 호출 시 () 안에 지정해준 값들
- static 메서드는 같은 클래스 내의 인스턴스 메서드 호출 불가능
- return 문
- JVM의 메모리 구조
- 메소드 영역 : 클래스 데이터(클래스 변수) → 해당 클래스의 .class 파일을 읽어 저장하는 곳
- 힙 : 인스턴스가 저장되는 공간
- 호출 스택(call stack) : 메서드 작업에 필요한 메모리 공간 제공, 지역 변수가 있는 공간
- 기본형 매개변수와 참조형 매개변수
- 매개변수 타입이 기본형(primitive) 면 값이 복사되지만, 참조형(reference)이면 인스턴스의 주소 복사
- 따라서 참조형 매개변수는 변수의 값을 읽고 변경까지 가능
- 참조형 반환타입
- 재귀 호출
- 클래스 메서드(static 메서드)와 인스턴스 메서드
- 클래스 설계 시 멤버 변수 중 모든 인스턴스에 공통 사용되는 것에 static 붙임
- 클래스 변수는 인스턴스 생성 없이도 사용 가능 → 클래스가 메모리에 올라갈 때 이미 자동 생성되기 때문
- 클래스 메서드는 인스턴스 변수 사용 불가
- 메서드 내에서 인스턴스 변수 사용 안하면, static 고려 → 메서드 호출 시간이 짧아짐
- 클래스 멤버와 인스턴스 멤버간의 참조와 호출
- static 메서드 내에서는 인스턴스 멤버 변수, 메서드 모두 호출 불가능
4. 오버로딩(overloading)
- 오버로딩이란?
- 같은 이름을 가진 메서드지만 매개변수의 개수 또는 타입이 다른 경우
- 오버로딩의 조건
- 메서드 이름 같아야함
- 매개변수의 개수 또는 타입 달라야함
- 리턴 타입은 영향 못줌
- 오버로딩의 예
- 오버로딩의 장점
- 메서드 이름을 절약할 수 있고, 같은 기능을 하도록 확실하게 만들 수 있음
- 가변인자(varargs)와 오버로딩
- Object… args 와 같이 사용
- 무조건 매개변수 리스트 중 마지막에 넣어야 함
- 내부적으로 배열을 만들어 사용하는 것 → 약간 비효율
- void a(String a, String… args), void a(String… args) 와 같이 오버로딩 시 컴파일 에러 → 가변 인자 메서드는 오버로딩하지 않는게 좋음
5. 생성자 (constructor)
- 생성자란?
- 인스턴스 초기화 메서드
- 이름이 클래스 이름과 같아야 하고, 리턴 값이 없음
- 오버로딩 가능
- 연산자 new가 인스턴스 생성하는 것 ← 생성자가 인스턴스를 생성하는 게 아님
- 기본 생성자 (default constructor)
- 클래스에 생성자 하나도 없으면 자바 컴파일러가 자동 추가
- 하나라도 있으면 자동 추가 안됨
- 매개변수가 있는 생성자
- 생성자에서 다른 생성자 호출하기 - this(), this
- this()
- 반드시 생성자 내 첫줄에서만 사용 가능
- 생성자 내에서 다른 생성자 호출할 때 사용
- this
- 생성자를 이용한 인스턴스의 복사
- 현재 사용하는 인스턴스와 같은 상태의 인스턴스 하나 더 만들 때 생성자 사용 가능
- Car(Car c) {} 와 같이 사용
- Object 클래스의 clone() 으로도 가능
- 상태는 같지만, 독립적인 메모리 공간을 갖고 있음
6. 변수의 초기화
- 변수의 초기화
- 클래스 변수 및 인스턴스 변수는 자동적으로 초기화해줌
- 지역 변수는 직접 해야함
- 초기화 방법
- 명시적 초기화 (explicit initialization)
- 초기화 블럭
- 클래스 초기화 블럭 - static {}
- 인스턴스 초기화 블럭 - {}
- 클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번만 수행
- 인스턴스 초기화 블럭은 인스턴스 생성 시 수행 ← 생성자보다 인스턴스 초기화 블럭 먼저 수행
- 멤버변수의 초기화 시기와 순서
- 클래스 변수 : 기본값 → 명시적 초기화 → 클래스 초기화 블럭
- 인스턴스 변수 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
https://product.kyobobook.co.kr/detail/S000001550352