JAVA

[JAVA] 객체지향언어1

날아 2023. 1. 29. 20:00

1. 주요특징 

  1. 코드의 재사용성 높음
  2. 유지보수 용이
  3. 중복된 코드의 제거 
  • 캡슐화
  • 상속
  • 추상화
  • 다형성 

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)와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수적이다.

  1. 자동초기화
  2. 간단초기화(=)
  3. 초기화블럭 {}
  4. 생성자 (iv 전용)

 

 

출저

도서 자바의 정석 (남궁성 강사님)