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번은 객체지향적.
//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. 값(입력)을 받아서 처리하고, 결과를 반환(출력)
메서드 = 선언부 + 구현부
*메서드의 호출
메서드이름(값1, 값2, ....); //메서드 호출방법
Ex)
1. print99danAll( ); //void print99danAll( )을 호출
(입력값이 필요 없음. 반환타입이 void인 이유는 출력이 없기 때문에다.)
int result = add(3, 5); //int add(int x, int y)를 호출하고, 결과를 result에 저장.
(메서드가 add이기 때문에 값이 필요)
------------------------------------------------------------------------------------------
*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 |