JAVA
[JAVA] 객체지향언어1
날아
2023. 1. 29. 20:00
1. 주요특징
- 코드의 재사용성 높음
- 유지보수 용이
- 중복된 코드의 제거
- 캡슐화
- 상속
- 추상화
- 다형성
2. 클래스와 객체
클래스
- 설계도(객체 정의) ex).TV(객체) TV설계도(클래스)
- 메소드 + 변수
- 사용자 정의 타입
객체
- 속성 -> 변수
- 기능 -> 메서드
인스턴스의 생성과 사용
- 클래스를 선언한 것은 설계도를 작성한 것에 불과하므로, 인스턴스를 생성해야 제품(TV)를 사용할 수 있다.
- 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
class TV {
//Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원
int channel; //채널
//TV의 기능(메서드)
void power() {power = !power;} //Tv를 켜거나 끄는 기능을 하는 메서드
void channelUp() {++channel} //채널을 높이는 메서드
void channelDown() {--channel;} //채널을 낮추는 메서드
} // class TV 종료
class Tvtest {
Public static void main(String args[]){
Tv t = new Tv(); //tv인스턴스 생성
Tv t2 = new Tv();
t2 = t; //t가 저장하고 있는 값(주소)를 t2에 저장한다.
t.channel = 7;
t.channelDown();
System.out.println(t.channel); //6이 출력된다.
System.out.println(t2.channel); //7이 출력된다.(같은 주소를 참조하기때문에)
}
}
객체배열
- 참조변수를 배열해놓은 것
- 객체를 생성해서 객체 배열의 각 요소에 저장하는 것을 잊으면 안된다.
- Tv[] tvArr = { new Tv();. new Tv(), new Tv(); }
- 다뤄야할 객체의 수가 많을 때는 반복문을 사용한다.
Tv[] tvArr = new Tv[100];
for(int i=0; i<tvArr.length; i++) {
tvArr[i] = new Tv(); }
3. 변수와 메서드
선언위치에 따른 변수의 종류
class Variables {
int iv; //인스턴스변수 (클래스영역)(인스턴스가 생성되었을 때)
static int cv; //클래스변수 (클래스영역) (클래스가 메모리에 올라갈 때)
void method(){
int lv = 0; //지역변수 (메서드영역) (변수 선언문이 수행되었을 때)
}
}
- 인스턴스 변수 : 객체마다 다르게 유지되는 값
- 클래스변수 : 모든 객체가 공통으로 갖는 값
메서드
명령문의 집합
- 높은 재사용성
- 중복된 코드의 제거
- 프로그램의 구조화
반환타입 메서드이름 (타입 변수명, 타입 변수명, ....) //선언부
{
//구현부
}
int add (int x, int y) {
return x + y;
} //작업 결과(반환값)과 반환타입은 타입이 일치해야 한다.
메서드이름(값 1, 값2) //메서드를 호출하는 방법
int result = add(3,5); //inr add(int x, int y)를 호출하고, 결과는 result에 저장
클래스 메서드와 인스턴스 메서드
iv 사용 유무의 차이가 있다.
- 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
- 클래스변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙인다.
class MyMath2{
long a, b; //iv
//인스턴스변수 a,b만을 이용해서 작업하므로 매개변수가 필요없다.
long add() {return a+b;}
//인스턴스와 관계없이 매개변수만으로 작업이 가능하다.
static long add(long a, long b) {return a+b;} //a,b는 지역변수(매개변수)
}
class MathTest{
Public static void main(String args[]){
MyMath2 mm = new MyMath(); //인스턴스를 생성
mm.a = 200L;
mm.b = 100L;
//인스턴스메서드는 객체생성 후에만 호출이 가능함
mm.add();
//클래스메서드호출. 인스턴스 생성없이 호출가능
Mymath.add(100L,200L);
매개변수의 유효성 검사
float divide(int x, int y){
//작업을 하기 전에 나누는 수(y)가 0인지 확인한다.
if(y==0){
return 0; //매개변수가 유효하지 않으므로 메서드를 종료한다.
}
return x /(float)y;
}
//0으로 나누는 것은 금지되어 있기 때문에 계산 전에 유효성검사를 꼭 한다.
4. 오버로딩
한 클래스 내에 같은 이름의 메서드를 여러 개 정의
- 메서드 이름이 같아야한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 반환타입 영향 X
int add(int a, int b) {return a+b;}
long add(long a, long b) {return a+b;}
long add(int[] a) {
long result = 0;
for(int i=0; i<a.length; i++){
result += a[i];
}
return result;
}
//위 셋의 메서드들은 모두 바르게 오버로딩 되어있다.
5. 생성자
인스턴스 초기화 메서드
- 생성자의 이름 == 클래스의 이름
- 리턴값이 없다. (void를 적지는 않는다)
기본생성자
클래스에 생성자가 하나도 정의되지 않을 경우 자동적으로 기본 생성자가 추가된다.
클래스이름 () {}
this와 this()
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출 때는 반드시 첫줄에 호출해야한다.
- this : 인스턴스 자신을 가리키는 참조변수
- this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
class Car {
String color;
String gearType;
int door;
Car(){
this("white", "auto", 4); //Car(String color, String gearType, int door)를 호출
}
Car(String color){
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
6. 변수의 초기화
멤버변수(iv,cv)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.
- 자동초기화
- 간단초기화(=)
- 초기화블럭 {}
- 생성자 (iv 전용)
출저
도서 자바의 정석 (남궁성 강사님)