본문 바로가기

JAVA/기초 문법

객체지행개념 6장

1. 클래스 작성(설계도)

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

   1.  속성(변수) = 크기, 길이, 높이, 색상, 볼륨, 채널 등

예) 속성 --> 변수 (클래스 설계도)

   2. 기능(메서드) = 켜기, 끄기, 볼륨 높이기/낮추기, 채널 변경하기 등

예) 기능 --> 메서드 (클래스 설계도)

 

*객체와 인스턴스

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

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

클래스로부터 객체를 만드는 것을 인스턴스화 한다고 한다.

 

 

*클래스와 객체

(클래스란? - 설계도. 객체란? - 제품)

 

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

A. 객체를 생성하기 위해

 

Q. 객체가 왜 필요한가?

A. 객체를 사용하기 위해

 

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

A. 객체가 가진 속성(변수)과 기능(메서드)을 사용하려고

 

 

 

-------------------------------------------------------------------------------------------

 

 

2. 객체 생성(제품 생성)

* 객체의 생성

클래스명 변수명 ;                // 클래스의 객체를 참조하기 위한 참조변수를 선언

변수명 = new 클래스명( ) ;     // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

 

Tv t ;                                // t 는 참조변수(리모컨), Tv클래스 타입의 참조변수 t를 선언

                                      // (변수선언문) 

 

t = new Tv( ) ;                     // Tv인스턴스를 생성 한 수, 생성된 Tv인스턴스의 주소를 t에 저장, new Tv( ) ; 는 객체.

 

 

 

 

 

 

3. 객체의 사용(제품 사용)

사용은 t라는 리모콘을 사용하여(ex. t.channel 등) 사용

 

* 객체의 사용

 

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

(뜻 ; t와 연결된 객체의 channel이라는 뜻)

 

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

(뜻; t가 가르키는 객체의 channelDown()이라는 메서드를 호출(사용)한다. -> 메서드가 가지고있는 문장들이 실행됨

 

System.out.println("t1의 채널은 " + t.channel + "입니다.");

 

 

 

 

-------------------------------------------------------------------------------------------------

 

 

 

 

**객체 배열

 

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

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형식

 

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

Tv[ ] tvArr = new Tv[3];

tvArr[0] = new Tv( );

tvArr[1] = new Tv( );

tvArr[2] = new Tv( );

//쭉 세로로 붙어있는 3개 리모콘에 각각 tv가 딸려있음

//객체 t1,t2,t3를 세로로 쭉 붙여놓은것과 동일

 

 

*클래스의 정의

클래스 == 데이터 + 함수

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

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

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

 

4. 클래스 : 데이터(변수)와 함수의 결합 (구조체 + 함수(메서드 : 명령문 묶음))

              //설계도, 데이터+함수, 사용자정의 타입

 

    사용자정의 타입을 사용하여 원하는 타입 만들기

//맨 마지막줄은 시간은 시간끼리, 분은 분끼리, 초는 초끼리 묶임

//---> 시간, 분, 초를 묶어줘 편하게 사용

 

// 세개의 변수를 묶어서 다루니 코드가 간결해지고 시, 분, 초가 하나로 묶여 앞의 배열처럼 시분초가 따로 묶이지 않음

 

 

12시 34분 56초를 입력할 때;

1번 방법
2번 방법

//코드는 서로 같으나 1번은 비객체지향적, 2번은 객체지향적.

//2번이 코드가 쉬워지고 유지보수하기 편해짐

 

 

 

 

----------------------------------------------------------------------------------------------

 

 

 

*변수의 종류

 

** 선언위치

1. 클래스 영역 - iv, cv

선언문만 가능(클래스, 메서드..)

//객체는 iv의 묶음

2. 메서드 영역 - lv

 

* 변수의 종류

. iv (인스턴스 변수)

       //객체생성 해야 사용가능

ㄴ. cv (클래스 변수 - static변수, 공유변수)

       // iv 앞에 static을 붙이면 cv가 됨.

       // cv는 객체생성이 필요 없음,  iv는 객체생성 필요.

ㄷ. lv (지역변수)

       //메서드 호출 된 후 사용

 

 

-----------------------------------------------------------------------------

 

 

 

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

 

포커카드

속성 : 무늬 , 숫자, 폭, 높이

// Card 객체마다 다르게 유지되어야 하는 개별속성(무늬, 숫자)와 공통속성-모든객체 공통인 (폭, 높이)로 나뉨

기능 : ----

 

객체의 속성중에  1. 개별적인것은 iv(인스턴스)로

 

                       2.  공통적인것은 cv(static)로 함

 

 

Card c = new Card( );   //객체생성

c.kind = "HEART";        //iv

c.number = 5;

 

Card.width = 200;        //cv는 가능하면 c.width = 200; 대신 클래스 이름을 앞에 붙인다. 

                               //Ex. (클래스이름. 변수/속성이름 = 값)

Card.height = 300;

 

 

 

 

 

----------------------------------------------------------------------------------------------

 

 

 

*메서드란?   

1. {문장들}을 묶어놓은 것 

 

배열 출력시 코드 중복이 있을 경우, 메서드 이름을 printArr로 지정하여 { } 사이에 입력 후 

ex)

 

아래 메서드 호출방법인 이름에 ( )는 방법으로 사용해주면 된다.

*따라서 메서드의 장점으로는

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

 

 

2. 값(입력)을 받아서 처리하고, 결과를 반환(출력)

 

 

 

 

메서드 = 선언부 + 구현부

위 첫째줄이 선언부, //메서드 호출시 수행될 코드가 구현부.

 

int 반환타입 add 메서드 이름 int a, int b 입력값(x와y는 매개변수, lv )

 

 

 

 

*메서드의 호출

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

Ex)

1. print99danAll( );                   //void print99danAll( )을 호출

(입력값이 필요 없음. 반환타입이 void인 이유는 출력이 없기 때문에다.)

 

int result = add(3, 5);            //int add(int x, int y)를 호출하고, 결과를 result에 저장.

(메서드가 add이기 때문에 값이 필요)

3과 5가 x,y에 대입됨.

 

 

 

------------------------------------------------------------------------------------------

 

 

 

 

*return문 반환

 

 

실행중인 메서드를 종료하고 호출한 곳으로 되돌아간다.

-반환타입이 void면 생략가능

-반환시 반환값이 앞 지정타입과 일치하거나 자동형변환이 되어야 한다.

 

 

 

---------------------------------------------------------------------------------------------

 

 

 

*호출 스택(call stack)

스택(stack)이란?

밑이 막힌 상자. 아래서부터 차곡차곡 쌓인다, 꺼낼때도 위에서부터 하나씩 꺼낸다.

 

호출스택이란?

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

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

 

 

-------------------------------------------------------------------------------------------------------------------

 

 

 

*기본형 매개변수

- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.

- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.

 

 

 

 

 

---------------------------------------------------------------------------------------------------------------------

 

 

*statric 메서드와 인스턴스 메서드

iv를 사용할 때는 static!

 

1. 인스턴스 메서드

- 인스턴스 생성 후,    '참조변수.메서드이름( )'으로 호출한다

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

-메서드 내에서 인스턴스 변수(iv) 사용가능

 

2. static 메서드(클래스 메서드)

-객체생성없이      '클래스이름.메서드이름( )'으로 호출한다

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

-메서드 내에서 인스턴스 변수(iv) 사용불가

 

 

Ex)

 

class MyMathTest2{
	public static void main(String args[]){                                                      

          System.out.println(MyMath2.add.200L,100L);   //클래스메서드 호출

          MyMath2 mm = new MyMath2();   //인스턴스 생성

          mm.a = 200L;

          mm.b = 100L;

          System.out.println(mm.add());    //인스턴스메서드 호출
          }
}

// 클래스메서드 (static 메서드) 

MyMath2 : 클래스 이름.  객체생성 없음

 

//인스턴스 생성

객체생성 후 //인스턴스 메서드 호출.     (참조변수.iv) 값 셋팅. (참조변수 : mm)

 

 

 

**static을 언제 붙여야 할까?

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

//인스턴스변수(iv) 인 개별속성
String kind;                // 무늬   
int number;                 // 숫자

//클래스변수(cv)인 공통속성
static int width = 100;     // 폭
static int height = 250;    // 높이

Ex) 포커카드의 클래스변수(cv)인 공통속성

 

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

 

 

 

 

 

 

--------------------------------------------------------------------------------------------------------------------

 

 

**생성자 constructor 

 

생성자 = 메서드 = 인스턴스 초기화 메서드 = 객체 초기화 메서드 = iv 초기화 메서드

 

1) 객체생성, iv초기화

Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;

2) 생성자 호출

Timne t = new Time(12,34,56);

 

 

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

 

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

  // 인스턴스 생성 시 수행될 코드,

  // 주로 인스턴스 변수의 초기화 코드를 적는다.

}

 

-리턴값이 없다. ( void 안붙임 )

 

 

-모든 클래스는 반드시 생성자를 가져야 한다. (최소 1개)

(기본생성자 : 기본형 이름 ( ){ })

(생성자가 하나도 없을 때만 , 컴파일러가 자동추가해준다. 기본생성자 없이 조건생성자가 있게되면 호출 시 에러가 생길 수 있음.)

 

 

 

Ex)

class Car{
	String color;
    String gearType;
    int door;
    
    Car() {}
    Car(String c, String g, int d){
    	color = c;
        gearType = g;
        door = d;
        }
}

	^
	|
        |	(1) 번
        |
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;


	^
        |
        |	(2)번
        |
Car c = new Car("white", "auto", 4);
//	new : 객체생성
//        Car(...) : 생성자 호출
//        "white", "auto",... : 객체 초기화

Car() {}라는 생성자에 

(1)번 (2)번과 같이 각각의 코딩으로 iv를 초기화 할 수 있음.

 

 

 

 

 

**오버로딩

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

 

Ex) println()

void println()
void println(int x)
void println(char[] x)
void println(String x)
void println(Object)

메서드는 다르지만 매개변수가 다르다.

 

 

 

 

 

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

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

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

3. 반환타입은 영향없다

 

 

Ex) add()

int add(int a, int b){ return a+b}
int add(int x, int y){ return x+y}

매개변수의 개수와 타입이 같아 중복정의가 되어 오버로딩이 성립 안된다.

 

 

Ex) 

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

매개변수 타입이 달라 오버로딩이 성립된다. (같은 의미의 기능 수행)

 

 

 

 


 

 

 

 

 

**생성자 this()

-같은 클래스의  다른생성자 호출 할 때 사용

this(), this(매개변수)

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

 

코드의 중복을 제거할 때 사용

Car(){
	this("black","auto",4);
    }
    
    
    ^
    |
    | (변환)
    |


Car(){
	color = "black";
    gearType = "auto";
    door = 4;
    }

 

**참조변수 this

-인스턴스 자신을 가리키는 참조변수

-인스턴스 메서드(생성자 포함)에서 사용가능

-지역변수lv와 인스턴스 변수iv를 구별할 때 사용

 

Car(String color, String gearType, int door){

this.color = color;
this.gearType = gearType;
this.door = door;

**왼쪽 this가 붙은 것들은 iv, 오른쪽 은 lv

}

 

 

 

MyMath2(int a, int b){//생성자
this.a = a;
this.b = b;
}

**위 메서드 옆에 매개변수 a,b가 들어있어서  this 생략 불가능

생성자와 인스턴스 메서드에서  this사용가능

(static)클래스메서드에서는 this사용 불가

 

 

 

 

 

 

 


 

 

 

 

**변수의 초기화

Class Test{
	int x;			**인스턴스변수(자동초기화)
    int y = x;
    
    void method1(){		**i와 j는 지역변수여서(메서드안에서 생성)
    	int i;			**j = i 를 대입하는 과정에서 에러가 난다.
        int j = i;		**i를 초기화 해주고 사용해줘야 한다
    }
}


 

멤버변수의 초기화

 

1. 명시적 초기화(=)

참조형변수 초기화 : 기본값(null) 또는 객체의 주소

 

2. 초기화 블럭 :

- 인스턴스 초기화 블럭 : { 여러 문장 }   (iv초기화)

- 클래스 초기화 블럭 : static {  여러문장 }         (cv초기화)

 

3. 생성자 (iv초기화/복잡한 초기화)

 

 

 

*정리

- cv,iv초기화

1. 자동초기화 0

2. 간단 초기화 =

3. 복찹초기화 {  }, 생성자(iv), static{  }(cv)

 

- 순서:

cv ->iv

자동 -> 간단 -> 복잡

 

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JAVA > 기초 문법' 카테고리의 다른 글

제어문  (0) 2020.05.21
배열  (0) 2020.05.20
연산자, 2진법/16진법, Random  (0) 2020.05.20
변수, Scanner, byte  (0) 2020.05.19
*첫날 메모  (0) 2020.05.18