혜야의 코딩스토리

객체지향 프로그래밍 I 본문

꿈 : 멋진 개발자 🧸/자바의 정석

객체지향 프로그래밍 I

hyeya_ 2022. 5. 2. 22:20

‘80년 초 소프트웨어의 위기 빠른 변화를 못 쫓아 감.

해결책으로 객체지향 언어를 도입 (절차적(순서대로) -> 객체지향)

-> 코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거

 

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

Oop (object-oriented programing) = 객체지향 프로그래밍

 

[객체지향 언어의 핵심개념]

1.     캡슐화

2.     상속

3.     추상화

4.     다형성*****가장 중요!

 

62~3 반복 후(이해한 후)

7(다형성까지 공부) 보기 // 6~다형성 계속 반복하여 이해하기.

 

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

-> 객체지향개념(규칙) 일단 외우기!!!! !!! ★★★★★

A4용지(2장분량)에 규칙의 개념을 요약한 후에 하루에 한번씩 보고 암기하기!

자바의 정석(기초편->3) 완료 후 이해가 안되어도,

너무 이해하려고 하지 말고 ~ 실습위주로 가는 것이 좋다.

-> 직접 만들어 보기! (: JSP, Spring / 모바일 : 안드로이드)

 

[클래스와 객체]

클래스의 정의 : 클래스란 객체를 정의해 놓은 것

클래스의 용도 : 클래스는 객체를 생성하는데 사용

 

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념

객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

 

클래스 객체
제품 설계도 제품
TV 설계도 TV

[객체의 구성요소 : 속성과 기능]

객체 = 속성(변수) + 기능(메서드)  

속성(변수) 크기, 길이, 높이, 색상, 볼륨, 채널 등
기능(메서드) 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등

 

[객체와 인스턴스]

객체 : 모든 인스턴스를 대표하는 일반적 용어

인스턴스 : 특정 클래스로부터 생성된 객체(: TV인스턴스)

                   인스턴스화

클래스 ----------------------->인스턴스(객체)

(설계도)                               (제품)

 

[클래스와 객체]

Q. 클래스가 왜 필요한가?

A. 객체를 생성하기 위해

 

Q. 객체가 왜 필요한가?

A. 객체를 사용하기 위해

 

Q. 객체를 사용한다는 것은?

A. 객체가 가진 속성과 기능을 사용하려고

 

클래스(설계도) 작성 -> 객체(제품) 생성 -> 객체(제품) 사용

 

[객체의 생성과 사용]

클래스명 변수명;

변수명 = new 클래스명( );

 

Tv t;   // Tv클래스 타입의 참조변수 t를 선언

-> Tv리모콘

t = new Tv( );  // Tv인스턴스를 생성한 후 , 생성된 Tv인스턴스의 주소를 t에 저장

-> Tv객체 생성

위의 두문장을 한문장으로 Tv t = new Tv( );

 

t.channel = 7;  //Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.

->변수 사용

 

t.channelDown( );  //Tv인스턴스의 메서드 channelDown( )을 호출한다.

->메서드 호출

 

System.out.println(“현재 채널은” + t.channel + “ 입니다.”); 

// “현재 채널은 6입니다출력됨.

 

t 

0x100

 0x100

null          //color
false        //power
6            //channel
power( )
chnnelup( )
chnneldown( )

 

[객체 배열]

객체 배열 == 참조변수의 배열

객체 배열은 단순히 참조변수의 배열이므로,

각 번지에 있는 참조변수에 객체를 생성해서 넣어줘야 한다.

그렇지 않으면 사용할 수 없다.

 

Tv[ ] tvArr = new Tv[3];  // Tv타입 참조변수 배열(객체배열)을 생성

 

tvArr[0] = new Tv( );

tvArr[1] = new Tv( );

tvArr[2] = new Tv( );  //객체를 생성해서 배열의 각 요소에 저장

 

[클래스의 정의-데이터와 함수의 결합]

클래스란?~~?

1) 설계도 2) 데이터+함수 3)사용자 정의 타입

 

*변수 : 하나의 데이터를 저장할 수 있는 공간

*배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간

*구조체 : 서로 관련된 여러 데이터(종류 관계x)를 하나로 저장할 수 있는 공간

*클래스 : 데이터와 함수의 결합 (구조체+함수)  //함수 = 메서드

 

[클래스의 정의-사용자의 정의 타입]

-원하는 타입을 직접 만들 수 있음

-서로 관련된 데이터를 하나로 묶어서 객체 지향적인 코드로 만들 수 있음

 

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

★★★★★ 객체 = iv 를 묶어 놓은 것 ★★★★★

 

*영역

   클래스 영역 – iv, cv(static+iv) : 선언문만 가능

   메서드 영역 – lv

 

*변수 종류

1. iv (인스턴스 변수) 참조변수.변수이름

클래스 영역

인스턴스가 생성되었을 때 생성된다.

객체 == iv 묶음

객체생성을 해야만 사용 가능하다

 

2. cv (클래스변수)

클래스 영역

클래스가 메모리에 올라갈 때 생성된다.

객체생성 없이 아무때나 사용 가능하다.

 

3.lv (지역 변수)

메서드 영역

메서드 영역 내 변수 선언문이 수행되었을 때 생성된다.

 

[클래스 변수와 인스턴스 변수]

인스턴스 변수 (개별 속성) : 객체마다 다르게 유지 되어야함. (카드의 무늬,숫자)

클래스 변수 (공통 속성) : 모든 객체의 공통 속성. (카드의 폭, 높이)

 

1.     Cv는 객체 생성 없이 클래스이름.클래스변수로 직접 사용 가능함.

-> 클래스이름.변수이름(Card.width)으로 사용 권장. (cviv로 혼동할 수 있기 때문)

2.     코드를 그림으로 그리는 연습하기 (플래시 파일 활용)

 

[호출 스택 call stack]

스택 : 밑이 막힌 상자, 위에 차곡차곡 쌓임.

(13사이 중간에 넣거나 2아래의 1만 꺼낼 수는 없음)

넣을 때 순서 : 1->2->3

꺼낼 떄 순서 : 3->2->1

 

*호출 스택

-메서드 수행에 필요한 메모리가 제공되는 공간

-메서드가 호출되면 호출 스택에 메모리를 할당, 종료되면 해제

-아래 메서드가 위에 메서드를 호출.

-맨 위 메서드 하나만 실행 중, 아래 메서드들은 대기 상태.

 

[기본형 매개변수 & 참조형 매개변수]

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only, 변경 x)

-> 어딘 가에 저장된 값을 받아서 사용할 순 있지만, 그 저장된 장소는 모르기 때문에 값을 변경할 수 없다,

-> Boolean , char, byte, short, int, long, float, double // 기본형 8 

 

참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)

 

[참조형 매개변수]

-매개변수로 참조형 변수를 전달할 경우, 변수가 가리키는 객체의 주소 값이 전달됨.

-매개변수로 전달된 변수와 같은 객체를 가리키기 때문에 값의 변경이 가능함.

 

[참조형 반환타입]

반환 값으로 객체의 주소 값을 전달함.

 

 

Static 메서드 (=클래스 메서드)  // iv사용 X

-객체 생성 없이 클래스이름.메서드이름( ); 방식으로 호출

-인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드

-메서드 내에서 iv 사용 불가

 

인스턴스 메서드 // iv 사용O

-인스턴스 생성 후 참조변수.메서드이름( ); 방식으로 호출

-인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드

-iv로 작업하기  때문에iv가 필요한 것. iv묶음인 객체가 필요한 것은 당연함..

-인스턴스(객체)를 생성하고 인스턴스 메서드를 호출함.

 

객체 : iv(변수) 묶음이다. (그냥 외우면 된다. 이해하려고 하지 않기)

메서드 : 명령문 집합

 

[static을 언제 붙여야 할까?]

1. 속성(멤버 변수)중에서 공통 속성에 static을 붙인다.

2. 인스턴스 멤버(iv, im)를 사용하지 않는 메서드에 static을 붙인다.

(=iv를 사용하지 않는 경우)

 

Static메서드는 인스턴스 멤버(im, iv)를 사용할 수 없다.

 

[메서드 간의 호출과 참조]

Q. static메서드는 static메서드 호출 가능?

A. yes…

 

Q. static메서드는 인스턴스 변수(iv) 사용 가능?

A. no… iv는 객체를 생성해야 사용이 가능하다. 여기서 객체는 iv묶음이다.

 

Q. static메서드는 인스턴스 메서드 호출 가능?

A. no…. 인스턴스 메서드는 iv로 작업하는 메서드이며 iv를 필요로 하기 때문.

 

Q. ? static메서드는 인스턴스 멤버를(iv, im) 쓸 수 없나요?

A. static메서드는 객체 생성이 필요하지 않기 때문에 static메서드 호출 시 객체(iv묶음) 생성여부를 알 수 없기 떄문이다.

 

 

인스턴스 메서드 : 객체 생성 후 호출 가능

static메서드 : 객체 생성이 있든 없든 항상호출 가능

// iv (인스턴스변수) : 객체 생성 후 사용 가능

// cv (클래스 변수) : 언제든 사용가능

 

[오버로딩 overloading] 과적하다

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

대표적인 것이 println( )메서드 -> 매개변수의 타입이 달라도 모두 출력 됨

 

[오버로딩이 성립하기 위한 조건 3가지]

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 반환 타입은 영향이 없다.

*메서드 호출 시 매개변수 타입이 모호할 경우 컴파일 에러 발생

-> 오버로딩의 올바른 예 : 매개변수는 다르지만 같은 의미의 기능 수행

 

※메서드 호출 시 매개변수의 타입이 모호한 경우 컴파일 에러 발생

ex)

① long add(int a, long b) {return a+b;}

② long add(long a, int b) {return a+b;}

-> add(3,3); 호출 시 타입이 모호하여 컴파일 에러 발생

-> add(3,3L); 호출 시 1번 메서드 호출됨

 

[생성자 constructor]

인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드=생성자

-> 인스턴스 == iv묶음0

-> 그래서, 인스턴스 초기화 메서드== iv초기화 메서드 = 생성자

 

※생성자도 메소드이지만..비교하자면

반환타입이 있다 => 메소드

반환타입이 없다, 이름이 클래스이름이다 => 생성자(인스턴스 초기화 메소드)

 

[생성자의 규칙]

1. 생성자의 이름은 클래스이름과 같아야 한다.

 "클래스 이름( ) { }"   ||   "클래스 이름(타입 변수명, 타입 변수명, ...) { }"

2. 리턴 값이 없다. (생성자는 void 안 붙임) -> 초기화는 대입문이므로 리턴 값 x

3. 모든 클래스는 반드시 1개 이상의 생성자가 있어야 한다.

 

[기본 생성자] "클래스 이름( ) { }"

-매개변수가 없는 생성자

-클래스 내에 생성자가 하나도 없을 때만, 컴파일러가 자동으로 기본 생성자를 추가해준다.

 

ex) Car C = new Car( ); //객체 생성과 동시에 기본생성자를 호출하는 문장

→Car 클래스에 생성자가 하나도 없었다면 컴파일러가 자동으로 기본생성자를 추가해준다.

(여태 오류가 나지 않았던 이유)

 

※생성자를 만들 땐 기본생성자를 함께 만드는 습관을 들이기

→ 한개라도 User define한 생성자가 만들어지면 더이상 컴파일러는 기본 생성자를 자동으로 만들지 않기 때문이다.

 

[매개변수가 있는 생성자] "클래스 이름(타입 변수명, 타입 변수명, ...) { }"

Car C = new Car( ); //객체 생성과 동시에 기본생성자를 호출하는 문장

c. color = “white”;

c.gearType = “auto”;

c.door = 4;

Car c = new Car(“white”,”auto”,4); //Car클래스에 기본생성자가 있다면 한 줄로 가능함.

*****위 문장의 수행과정 알기

① 참조변수 c선언

② new연산자가 객체를 생성

③ 생성자 호출   매개변수에 전달해서 객체 초기화

④ 참조변수c와 객체 연결 (대입연산자에 의해)

 

[생성자 this( )] "this( ) || this(매개변수)"

1. 같은 클래스의 생성자에서 다른 생성자를 호출할 때 사용

->this()가 선언되면 나(생성자)와 이름이 같은 생성자(오버로딩 된 생성자)를 호출하는 것

2. 다른 생성자 호출 시 첫 줄에서만 사용 가능

*생성자 this( )를 사용함으로써 코드의 중복을 제거해 더 좋은 코드로 만들 수 있다~!

this( )를 사용하지 않고 클래스이름 사용하면 컴파일 에러가 발생한다.

 

※ 생성자this( )와 참조변수 this는 전혀 연관이 없다.

 

[참조변수 this]

1. 인스턴스 자신을 가리키는 참조변수, 인스턴스 주소가 저장되어 있다.

(선언 안 해도 사용 가능함)

2. 인스턴스 메서드에서만(생성자 포함) 사용 가능 //static메서드에서는 사용 불가

-> 왜? this는 인스턴스 자기 자신을 가리키며,

static메서드는 iv사용 불가이므로 this도 사용 불가함.

3. 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용 (iv는 원래 참조변수.변수이름”)

-> “lviv의 이름이 같을 때” iv앞에 this를 붙여 구별할 수 있음

4. 지역변수(lv)와 인스턴스 변수(iv)의 이름이 다를 때 this는 생략 가능하다. (단 같은 클래스에서)

5. iv의 진짜 이름은 "참조변수.변수이름"이다. 

 

[변수의 초기화]

-지역변수는 사용하기 전에 수동으로 반드시 초기화해야 한다.

-멤버변수(iv, cv)는 자동초기화 된다. (수동으로 하면 초기화해줘야 할 것이 너무 많기 때문이다)

① 자동초기화(기본값0으로 초기화, 타입에 따라 다를 수 있음)

② 간단초기화(=, 대입연산자)

③ 복잡초기화(초기화 블럭 사용//cv초기화-> static{ }, iv초기화-> 생성자)

 

[멤버변수 초기화 순서]

1.      cv초기화                 iv초기화

 (자동→간단→복잡)        (자동→간단→복잡)

 

2. 자동초기화 (기본0으로 초기화) → 간단초기화 (=,대입연산자) → 복잡초기화(static{ },생성자)

*클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번

*인스턴스 변수 초기화 시점 : 인스턴스가 생성 될 때 마다

→ 그러므로 cv가 먼저 초기화 된 후에 iv가 초기화된다.

'꿈 : 멋진 개발자 🧸 > 자바의 정석' 카테고리의 다른 글

추상 클래스 & 인터페이스  (0) 2022.05.06
객체지향 프로그래밍 II  (0) 2022.05.06
Method 메서드  (0) 2022.04.29
배열  (0) 2022.04.29
연산자  (0) 2022.04.28