자바의정석 6장

서현우·2022년 3월 13일
0

자바의정석

목록 보기
6/22

6장 객체지향개념 I

ch6-1 객체지향 언어

  • 80년 초 소프트웨어의 위기 - 빠른 변화를 못쫓아감
  • 해결책으로 객체지향 언어를 도입(전차적 -> 객체지향)
  • 코드의 재사용성이 높고 유지보수가 용이, 중복 코드 제거
  • 객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)

OOP(Object Oriented Programming)의 특징

(캡 상 추 다)
1. 캡슐화
2. 상속
3. 추상화
4. 다형성

객체지향 개념 공부법

Q. 객체지향 개념은 어떻게 공부해야 하나요?

  1. 6장 2~3번 반복해서 이해
  2. 7장 다형성까지 공부
  3. 6장~7장 반복
  4. 추상화, 인터페이스 공부

@객체지향개념 규칙을 외워야함!
@A4용지 2장 정도로 정리해서 하루 1번씩 보기!
@그 이후 JSP, Spring으로 실습을 통해 빨리 응용 해봐야한다.(이해보단 실습위주로!!)
@추가로 디자인패턴, 객체지향 개념 관련 책은 실습 이후에 봐라.

ch6-2 클래스와 객체

클래스의 정의

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

클래스의 용도

  • 클래스는 객체를 생성하는데 사용

객체의 정의

  • 실제로 존재하는 것. 사물 또는 개념

객체의 용도

  • 객체가 가지고 있는 기능과 속성에 따라 다름

ch6-3 객체의 구성요소 - 속성과 기능

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

예) Tv
속성(변수): 크기, 길이, 높이, 색상, 볼륨, 채널 등
기능(메서드): 켜기, 끄기, 볼륨 업, 볼륨 다운, 채널 변경 등

class Tv {    //Tv 설계
String color; //색깔
boolean power; //전원상태
int channel; //채널

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

ch6-4 객체와 인스턴스(거의 같은 용어)

객체 : 모든 인스턴스를 대표하는 일반적 용어
인스턴스 : 특정 클래스로부터 생성된 객체(예:Tv인스턴스)

클래스(설계도) ---> 인스턴스(객체)(제품)
//인스턴스화(제품생성)

Q. 클래스(설계도)가 왜 필요한가?
A. 객체(제품)를 생성하기 위해

Q. 객체(예 Tv)가 왜 필요한가?
A. 객체를 사용하기 위해

Q. 객체를 사용한다는 것은?
A. 객체가 가진 속성(변수)과 기능(메서드)을 사용하려고

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

(보통은 하나의 소스파일에 하나의 클래스)

올바른 작성 예

Hello2.java
public class Hello2 {} 
class Hello3 {}
//public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야한다.

Hello2.java
class Hello2 {} 
class Hello3 {}
//public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.

잘못된 작성 예

Hello2.java
public class Hello2 {} 
public class Hello3 {}
//하나의 소스파일에 둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스에 public을 붙이지 않아야 한다.

Hello3.java
public class Hello2 {}
class Hello3 {}
//소스파일의 이름이 public class의 이름과 일치하지 않는다. 소스파일의 이름을 'Hello2.java'로 변경해야 맞다.

hello2.java
public class Hello2 {}
class Hello3 {}
//소스파일의 이름과 public class의 이름이 일치하지 않는다.
대소문자를 구분하므로 대소문자까지 일치해야한다.
그래서 소스파일의 이름을 'H'로 바꿔야 한다.

ch6-6 객체의 생성과 사용 - 클래스(설계도) 작성

  1. 객체의 생성
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t; //Tv클래스 타입의 참조변수(리모콘) t를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

Tv t= new Tv();
//참조변수(리모콘)을 객체와 연결 
  1. 객체의 사용 - 변수와 메서드를 사용
t.channel = 7; //Tv인스턴스의 멤버변수 channel에 7을 저장한다.
t.channelDown(); //Tv인스턴스 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 "+t.channel+" 입니다.");
  1. 클래스 작성 - Tv 설계도 작성
  2. 객체 생성 - Tv 제품 생성
  3. 객체 사용 - Tv 제품 사용
Tv t; //Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스 주소를 t에 저장
Tv t;  //객체 생성 - Tv인스턴스를 참조하기 위해 변수 t선언
t = new Tv(); //객체 생성 - Tv인스턴스 생성

t.channel = 7; //객체 사용 - 변수 사용
t.channelDown(); //객체 사용 - 메서드 사용
객체의 생성과 사용 - 예제
Tv t1 = new Tv();
Tv t2 = new Tv();
t1.channel = 7;
//객체마다 별도의 저장공간이 생김

Tv t1 = new Tv(); 
Tv t2 = new Tv();
t2 = t1; //t2의 객체 사용불가, 2개의 리모컨이 하나의 객체를 가리킴
t1.channel = 7;

ch6-8 객체 배열

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

Tv tv1, tv2, tv3;  
--> Tv[] tvArr = new Tv[3] //길이가 3인 Tv타입의 참조변수 배열

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

--> Tv[] tvArr = { new Tv(), new Tv(), new Tv() }; //한 문장으로
Tv t1 = new Tv();
Tv t2 = new Tv();
Tv t3 = new Tv();

//참조변수 배열 == 객체의 배열 
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

ch6-9 클래스의 정의(1)

클래스

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

클래스 == 데이터 + 함수

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간
  2. 배열 : 같은 종류(같은 타입)의 여러 데이터를 하나로 저장할 수 있는 공간
  3. 구조체 : 서로 관련된 여러 데이터(종류 관계X, 다른 타입도 OK)를 하나로 저장할 수 있는 공간
  4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)
    --> 서로 관련있는 변수(데이터) + 서로 관련있는 함수(메서드)의 결합

ch6-10 클래스의 정의(2)

사용자 정의 타입 - 원하는 타입을 직접 만들 수 있다.

class Time {
	int hour;
	int minute;
	int second;
}

int hour;
int minute;
int second;
//시,분,초를 따로 묶음 <--> 시,분,초를 하나로 묶음 
Time t = new Time();


int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3;
//<--> 시,분,초를 하나로 묶음
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();


int[] hour = new int[3];
int[] minute = new int[3];
int[] second = new int[3];
//<--> 시,분,초를 하나로 묶음(객체 배열)
Time[] t = new Time[3];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();


//12시 34분 56초를 저장
//1. 비 객체지향
int hour = 12;
int minute = 34;
int second = 56;

//2. 객체지향
Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;

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

영역(영역은 오직 2개)

  1. 클래스영역 - iv //인스턴스변수, cv(static + iv) //클래스 변수, 클래스(클래스영역+메서드영역)에서 사용 가능.
  2. 메서드영역 - lv //지역변수, 메서드 영역 안에서만 유효하고 메서드가 끝나면 lv는 없어짐.
class Variables //클래스 영역 시작 - 선언문만 가능(변수선언, 메서드선언 두 개만 가능)
{
	int iv; //인스턴스 변수
	static int cv; //클래스 변수(static변수, 공유변수)
	
	void method() //메서드 영역 시작
	{
		int lv = 0; //지역변수
	}//메서드 끝
}//클래스 끝

객체 = iv를 묶어놓은 것

[정리]
영역

  • 클래스영역 - iv(인스턴스(객체) 생성될 때 생성), cv(static + iv, 객체 필요없음)
  • 메서드영역 - lv(메서드끝나면 제거)

ch6-12 클래스 변수(cv)와 인스턴스 변수(iv)

Card 객체

개별(iv) : 숫자, 무늬, 객체마다 다르게 유지되어야 함.
공통(cv) : 높이, 폭

속성
개별적인 것 : 무늬, 숫자 --> iv

공통적인 것 : 폭, 높이 --> cv

class Card {
	String kind; //무늬
	int number; //숫자

	static int width = 100; //폭
	static int height = 250; //높이
}
Card c = new Card(); //객체 생성
c.kind = "HEART"; //iv, 객체 사용 시작
c.number = 5; //iv, 객체 사용
Card.width = 200; //cv, 객체 사용
Card.height = 300; //cv, 객체 사용 끝

--flash 동영상 - member.exe 참고--

ch6-14 메서드란?

  1. 문장들을 {}(작업단위)으로 묶어놓은 것.
  2. 값(입력)을 받아서 처리하고, 결과를 반환(출력)// 함수와 비슷
int add(int x, int y) { //int - 반환타입, add - 메서드이름, int x, int y - 매개변수(입력)
	int result = x + y;
	return result; //결과를 반환
}

메서드의 장점

  • 코드의 중복을 줄일 수 있다.
  • 코드의 관리가 쉽다.
  • 코드를 재사용할 수 있다.
  • 코드가 간결해서 이해하기 쉬워진다.

메서드의 작성

  • 반복적으로 수행되는 여러 문장을 메서드로 작성
  • 하나의 메서드는 한 가지 기능만 수행하도록 작성

메서드란? = 선언부 + 구현부

int add(int a, int b)  //선언부
//int-반환타입, add-메서드이름, int a,b-매개변수
{
	int result = a+b; //구현부
	return result; //구현부
} //lv(지역변수)-a,b,result
//반환할게 없으면 반환타입을 void라고 씀

ch6-15 메서드의 구현부

지역변수(lv)

메서드 내에(메서드영역에) 선언된 변수, 매개변수(입력)와 메서드영역 변수.
다른 메서드와 이름이 같아도 문제 없다.

ch6-17 메서드의 호출

메서드를 불러서 작업을 시키는 것

메서드이름(값1, 값2, ...); //메서드를 호출하는 방법

print99danAll(); //void print99danAll()을 호출 - 입력X, 반환타입 void(출력이 없다)
int result = add(3,5); //int add(int x, int y)를 호출하고, 결과를 result에 저장

ch6-20 return문

  • 실행중인 메서드를 종료하고 호출한 곳으로 되돌아간다.
  • 반환타입이 void면 return문 생략 가능.
  • But 반환타입이 void가 아닌 경우, 반드시 return문 필요.
  • 조건문은 참일때, 거짓일때 둘 다 리턴문이 있어야함.

ch6-21 반환값

  • 반환타입이 void가 아닐때
  • 타입이 일치(자동형변환)

ch6-22 호출 스택(call stack)

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

스택(stack)

밑이 막힌 상자. 위에 차곡차곡 쌓인다.

기본형 매개변수

  • 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)
  • 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read & write)

---플래시 동영상(PrimitiveParam.exe, ReferenceParam.exe)참고---

profile
안녕하세요!!

0개의 댓글