[Week03 Day012][WED 11 MAY 2022]
Java OOP 1
Class and Object 클래스와 객체
Field and Method 필드와 메서드
Constructor 생성자
Java는 객체지향 프로그래밍(Object Oriented Program:
OOP)이다.
클래스란 객체를 정의해놓은 것, 객체의 설계도 또는 틀이다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된대로 생성된다.
(자바의 정석 기초편, 남궁 성)
구체적 추상적 데이터의 단위를 객체라고 표현한다.
객체의 정의 : 실제로 존재하고 있는 것, 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차 와 같은 사물
무형의 객체 : 수학 공식, 프로그램 에러와 같은 논리나 개념
객체를 사용한다는 것은 객체가 가지고 있는 속성와 기능을 사용한다는 것이다.
(자바의 정석 기초편, 남궁 성)
클래스는 설계도이고 객체는 클래스로부터 만들어지는 제품이구나~
이렇게 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도만 잘 만들어놓으면 제품을 만들고 유지, 보수하는 일이 쉬워지기 때문이라고 한다.
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 instantiate
클래스로부터 만들어진 객체를 그 클래스의 인스턴스 instance 라고 한다.
객체의 구성요소는 속성 Property 과 기능 function이다
Property -> 멤버변수 variable
funcion -> 메서드 method
예시)
변수variable
String color;
boolean power;
메서드 method
void power() { power = !power;}
void channelUp() { channel++;}
등등..
메서드 Method란 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. (수학의 함수와 같이..메서드 내부가 보이지 않는 블랙박스라고도 한다) sqrt(), println(), random()과 같은 메서드들..
메서드는 크게 선언부 header와 구현부 body로 이루어져 있다.
int add (int a, int b){ // header
int result = a + b; // body
return result;
}
Q) 지금까지 연습문제 풀면서 return을 왜 해줘야되는지도 모르고 했는데 메서드의 결과를 리턴하는 것이라 생각하면 되는지?
A) return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다는 의미라고 한다. 원래는 반환값 유무에 관계없이 모든 메서드에는 적어도 하나의 리턴문이 있어야하는데 반환타입이 void인 경우 리턴문이 없이도 아무런 문제가 없었던 이유는 컴파일러가 메서드의 마지막에 return;을 자동적으로 추가해주었기 때문이라고 한다.
카드 게임에 사용되는 카드 예시가 좋았다 (자바의 정석 기초편 p.174)
class Card {
String kind; // clover, diamond, 무늬
int Number; // 숫자
static int width = 100; // 폭
static int height = 250; //높이
}
각 Card 인스턴스는 자신만의 무늬와 숫자를 가지고 있는데 이를 인스턴스 변수로 선언하고, 모든 카드 공통인 값을 유지해야하는 폭과 높이는 클래스 변수로 선언한다.
-> 카드의 폭을 변경해야할 필요가 있을 경우, width값을 변경하면 모든 카드의 width값을 변경할 수 있다.
내가 이해를 하기론..
Static method란 class 내부에서 클래스 내부에 선언된 변수만으로 작업이 가능할 때 (지역 변수..?) static을 붙이는 것 같고
다른 class에서 정의한 함수를 호출할 필요가 있을 때 class명.method명(변수,변수) 등으로 사용할 때는 static을 붙이지 않는 것 같다. 맞는지 모르겠다!!!
Static을 언제 붙여야할까? (자바의 정석 기초편, p.190)
1. 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
2. 클래스변수 (static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 클래스 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면 static을 붙여준다.
- 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'
인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야하는 작업을 위해서도 사용된다.
class point{
point(int x, int y){ // 클래스이름은 생성자 이름과 같아야함
//어쩌구저쩌구
}
}
클래스에 생성자가 하나도 정의되지 않으면 컴파일러는 자동적으로 기본생성자를 추가하여 컴파일 한다.
class Car {
String color;
String geartype;
int door;
Car() {} // 기본 생성자
Car( String c, String g, int d) { // 생성자
color = c;
geartype = g;
door = d;
}
}
class Ex6_12 {
public static void main(String[] args) {
Car c1 = new Car(); // 방법1. 인스턴스 생성 후
c1.color = "white"; // 각 인스턴스 변수의 값을 변경
c1.geartype = "auto";
c.door = 4;
Car c = new Car("white", "auto", 4);
// 방법2. 매개변수 갖는 생성자를 사용.
// 인스턴스를 생성하는 동시에 원하는 값으로 초기화
}
}
방법1처럼 인스턴스 생성 후 각 변수의 값을 변경(지정?)하는 것보다는
방법2에서처럼 처음부터 매개변수를 갖는 생성자를 사용하는 것이
코드를 간결하고 직관적으로 만드는 구나~~~
방법2처럼 클래스를 작성할 때 생성자를 제공(?)함으로써
인스턴스 생성 후 별도로 초기화를 하지 않아도 되게 하는 것이 바람직하대.
생성자의 매개변수로 선언된 변수의 이름이 인스턴스 변수와 같을 때는 이름만으로는 두 변수가 서로 구별이 안 되기 때문에, 인스턴스변수 앞에 this를 사용하면 된다.
this 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
this와 this()는 비슷하게 생겼을 뿐 완전히 다른 것임에 유의.
this는 참조변수이고, this()는 생성자이다.