(오키) 자바의정석, 1주차 챕터 6 - 객체지향 개념1

1. 개념

프로그램밍 언어 패러다임으로 절차형, 선언형이 있었고 자바가 나올 때 객체지향 이 트렌드로 나오면서 자바가 객체지향을 기본으로 해서 만들어진 언어이다. 최근에는 함수형 프로그래밍 언어가 많이 쓰이기도 한단다. (스칼라 등) https://www.youtube.com/watch?v=H6JxxWL6bJI&t=2s

중요 객체지향 개념

  1. 다형성
  2. 추상화
  3. 인터페이스

객체지향 언어 = 프로그래밍 언어 + 객체지향 개념 (규칙)

2. 클래스와 객체

클래스의 정의 : 객체를 정의함, 설계도
객체의 정의: 실제로 존재, 인스턴스 화, aka 오브젝트

클래스의 구성

  1. 속성 > 변수
  2. 기능 > 메서스

객체: 모든 인스턴스를 대표 하는 일반 용어
인스턴스: 특정 크래스로부터 생성된 객체

5. 하나의 소스파일에 여러 클래스 작성

파일안에 여러 클래스 선언 가능 하지만 public class 는 단 하나만 가능하고 파일이름과 public class 명은 반드시 일치 해야 한다. 대소문자 또한 맞추어야 한다

6. 객체의 생성 및 사용

클래스명 변수명 = new 클래스명();
new 를 사용해서 인스턴스화 (객체 생성)한다.

변수명.멤버변수 = XXX;
. 를 사용해서 멤버 변수에 접근한다.

인스턴스시 객체 주소가 잡히고 거기에 멤버 변수와 메서드가 잡힌다.

1
2
3
4
5
6
7
8
9
Class TV {
String color;
boolean power;
int channel;

void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }
}

객체주소에 6개 멤버 (3개 변수, 3개 메서드)

1
2
3
4
Class t1 = new TV();
Class t2 = new TV();

t1 = t2;

객체마다 메모리가 따로 잡히고 참조가 없어지면 GC가 메모리를 정리 한다.

8 객체 배열

TV tv1, tv2, tv3;
TV[] tvArr = new TV[3];

9 클래스의 정의

클래스 = 데이터 + 함수
사용자 정의 가능 하다.

변수의 진화체
변수 -> 배열 -> 구조체 -> 클래스

11 선언 위치에 따른 변수의 종류

1
2
3
4
5
6
7
8
9
10
class Variables
{
int iv;
static int cv;

void method()
{
int lv = 0;
}
}
  1. 인스턴스 변수
  2. 클래스 변수 (static변수, 공유 변수)
  3. 메서드 영역 (지역 변수)

클래스 안을 클래스 영역과 메서스 영역으로 볼수 있고
클래스 영역에는 선언만 가능하다.

각 변수 종류별 생성 시기가 틀리다. (클래스 메모리 로딩 시점, 인스턴스 생성시, 변수 선언문 수행시)

12 클래스 변수와 인스턴스 변수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Card {
String kind; // iv
int number;

static int width = 300; // cv
static int height = 250;
}

Card.width;
Card.height;

Card c = new Card();
c.kind;
c.number;

14 메서드 란?

문장들 (statements)을 묶어 놓은것
한개의 메서드에 한개의 작업을 하도록..

15 호출 스택 (call stack)

메서드 수행에 필요한 메모리가 제공 되는 공간
메서드가 호출 되면 호출스택에 메모리 할당, 종료 되면 해제

1
2
3
main(){
print()
}

x -> main -> main,print -> main -> x

23 기본형 매개변수

매개변수로 기본형과 참조형이 있다.

  1. 기본형 매개변수 (primitive 로 8개 이다)
    함수로 passing 시키면 기본형은 read only
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Data { 
int x;
}
class Ex6_7 {
public static void main(String[] Args) {
Data d = new Data();
d.x = 10;
change(d.x);
}
static void change(int x)
{
x =1000;
}
}

2.참조형 매개변수, read & write 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Data { 
int x;
}
class Ex6_7 {
public static void main(String[] Args) {
Data d = new Data();
d.x = 10;
change(d);
}
static void change(Data d)
{
d.x =1000;
}
}

call by value 와 call by reference 으로 이해된다.

25 참조형 반환 타입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Data3 { int x; }
class Ex6_8 {
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;

Data d2 = copy(d);
}
static Data3 copy(Data3 d) { // 참조형 반환 타입
Data3 tmp = new Data3();
tmp.x = d.x;
return tmp;
}
}

26 인스턴스 메서드 와 클래스(static) 메서드

  1. 클래스는 인스턴스, 객체 생성 없이 쓸수 있다. 구문은 ClassName.MethodName();
    같은 class 안에 있는 static 메서스는 앞에 ClassName없이 부를수도 있다.

  2. 객체는 ? iv (인스턴스 변수의) 묶음 이다.

  3. static을 언제 붙혀야 하는가?

속성 (멤버 변수) 중에서 공통 속성에 static 을 붙인다.
인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.

4.메서드에서의 변수 사용 가능 여부

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TestClass2 {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수

void instanceMethod() {
iv; // 사용 가능
cv; // 사용 가능
}

void static staticMethod() {
iv; // 호출 X
cv; // 사용 가능
}
}

5.메서드 간의 호출과 참조

1
2
3
4
5
6
7
8
9
10
11
12
13
class TestClass {
void instanceMethod(){}
static void staticMethod() {}

void instanceMethod2() {
instanceMethod(); // 가능
staticMethod(); // 가능
}
void staticMethod() {
instanceMethod(); // 에러 (클래스 메서드 에서 인스턴스 메서드 호출 X)
staticMehtod2(); // 가능
}
}

30 오버로딩 (overloading)

한 클래스 안에 같은 이름의 메서드 여러 개 정의 하는 것

1
2
3
4
printf(int x);
printf(char c);
printf(double d);
...

오버로딩이 성립하기 위한 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 영향 없다.

32 생성자 constructor

  • 인스턴스 생성 될때 호출 되는 인스턴스 초기화 메서드
  • iv 초기화 등에 사용 됨
  • 규칙:
  1. 클래스이름과 이름이 같아야 한다.
  2. 매개 변수 없는 생성자를 default constructor라고 한다.
  3. 생성자가 하나도 없을때에만 컴파일러가 default을 자동 추가 해준다.
  4. 매개 변수 있는 생성자 (오버로딩 사용됨)를 추가 할수 있다.

36 생성자 this()

  • 생성자에서 다른 생성자 호출 할때 사용
  • 다른 생성자 호출 시 첫줄에서만 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Car {
String color;
String gearType;
int door;

Car() {
color = "red";
gear Type = "auto";
door = 4;
}

Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}

this()의 좋은 사용처 예시
중복된 코드 삭제 가능 하다.

1
2
3
Car() {
this("red", "auto", 4);
}

37 this 참조 변수

  • 인스턴스 자신을 가리키는 참조 변수, 인스턴스의 주소가 저장
  • 인스턴스 메서드 (생성자 포함)에서 사용 가능
  • 지역 변수와 인스턴스 변수를 구별 할때 사용

this는 자기 자신 참조 변수, this()는 생성자

38 변수의 초기화

  • 지역변수(lv)는 수동 초기화 해야 함 (사용전에 꼭)
  • 멤버변수(iv,cv)는 자동 초기화 된다.
1
2
3
4
5
6
7
8
9
class InitTest {
int x;
int y = x;

void method1() {
int i;
int j = i; // 에러
}
}

초기화 순서 방식

  1. 기본 초기화 (0으로)
  2. 명시적 간단 초기화
  3. 복잡 초기화

명시적으로 초기화 하는 습관 중요, 특히 참조형 변수의 경우 null 초기화 하는건 NPE 발생 위험으로 나쁜 방식이라 할수 있다. 아래 처럼 항시 명시적 초기화 하자

1
2
3
4
class Car {
int door = 4; // 기본형 변수의 초기화
Engine e = new Engine(); // 참조형 변수의 초기화
}

cv 복잡 초기화인 static {} 구문 사용 예제

1
2
3
4
5
6
7
8
9
class StaticBlockTest {
static int[] arr = new int[10]; // 명시적 초기화

static { // 클래스 초기화 블럭
for (int i = 0 ; i < 10; i ++){
arr[i] = (int) (Math.random()*10)+1;
}
}
}

iv는 항시 생성자로 복잡 초기화 해주는 것이 좋다

1
2
3
4
5
6
7
8
9
10
11
12
13
class InitTest {
static int cv = 1; // 명시적 초기화 (간단)
int iv = 1;

static {
cv = 2; // 클래스 초기화 블럭 (복잡)
}
{ iv = 2; } // 인스턴스의 초기화 블럭 (복잡)

InitTest() {
iv = 3;
}
}