정구리의 우주정복

[JAVA] 객체지향 프로그래밍 (1) 본문

JAVA/STUDY

[JAVA] 객체지향 프로그래밍 (1)

Jungry_ 2022. 2. 4. 18:53
반응형

객체지향이란거는 너무 어렵다

1. 객체지향의 장점


1- 코드의 재사용성이 높다

2- 코드의 관리가 용이하다

3- 신뢰성이 높은 프로그래밍을 가능하게 한다

 

!!처음부터 너무 객체지향에 얽메이지 말고 기능적으로 완성한 후에 어떻게 하면 더 객체지향적이 될 수 있을지 고민해보자!!

 

2. 클래스와 객체의 정의와 용도


클래스란 "객체를 정의해 놓은 것"
클래스의 용도는 "객체를 생성하는데 사용!"

클래스를 제품 설계도 , TV 설계도 , 붕어빵 기계 라고 한다면

객체는 제품, TV , 붕어빵이다 !!!

 

3. 객체와 인스턴스


클래스 ---------(인스턴스화) ----------> 인스턴스(객체)

 

또한 객체는 속성과 기능으로 구성되어있다.

 

속성은 :크기 , 길이 , 높이 등등등

기능 : 켜기, 끄기 등등등

 

보통 속성은 "멤버변수" 

기능은 "메소드" 라는 표현을 주로 사용한다

 

class Tv{
	String color;
    boolean power;
    int channel;
    
    void power(){power = !power;}
    void channelUp() {channel++;}
    void channelDown(){channer--;}
}

간단한 클래스를 선언한 모습이다 위의 3개는 변수 !! 아래 3개는 메소드이다

 

4. 인스턴스의 생성과 사용


클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후 객체의 주소를 참조변수에 저장

Tv t = new Tv();  

이런 방식으로 선언해주면 Tv t 에서 참조변수 t 를 선언하고 메모리에 공간이 마련된다

t = new Tv() 이때 메모리의 빈 공간이 만들어지고 t 에는 그 !!주소값!! 이 저장되게 된다

나름 그림을 그려봤다 

Tv t1 = new Tv;

Tv t2 = new Tv;

 

이렇게 인스턴스를 생성하고 t2 = t1 을 하면 t1이 복사가 되는 것이 아니라 t2가 t1 의 주소를 가르키게 되는것이다

따라서 t1의 값이 바뀌면 t2 의 값도 바뀌게 된다.

 

5. 변수와 메소드


변수에는 클래스변수, 인스턴스 변수, 지역변수 3가지가 있다.

1) 인스턴스 변수 : 클래스 영역에 선언되고 클래스에서 "인스턴스를 생성할때 만들어진다"

2) 클래스 변수 : 인스턴스 변수 앞에 static 을 붙이면 된다 ! 클래스 변수는 한 클래스 안에서 모든 인스턴스들이 공통적인 값을 갖게 된다 !!! 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있다.  만약 앞에 public 을 붙이게 되면 전역변수의 성격을 갖게된다

3) 지역 변수 : 메소드 내에서 선언되어 메소드 내에서만 사용되게 된다 while 이나 for 문 블럭 내에 선언된 지역변수는 그 블럭을 벗어나면 소멸되어 사용할 수 없게 된다.

package ch6;

class CardTest {
    public static void main(String[] args) {
        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number =10;

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;

        System.out.println("C1 >>"+c1.kind+" , "+c1.number+
                "  Width, Height >> "+c1.width+" , "+c1.height);
        System.out.println("C2 >>"+c2.kind+" , "+c2.number+
                "  Width, Height >> "+c2.width+" , "+c2.height);

        //클래스 변수의 값을 변경 (모든 인스턴스에게 공통 적용)
        Card.width = 200;
        Card.height = 300;

        System.out.println("C1 >>"+c1.kind+" , "+c1.number+
                "Width, Height >> "+c1.width+" , "+c1.height);
        System.out.println("C2 >>"+c2.kind+" , "+c2.number+
                "  Width, Height >> "+c2.width+" , "+c2.height);
    }
}

class Card{
    //인스턴스 변수(개별적인 값)
    String kind;
    int number;

    //클래스 변수 (고유한 값)
    static int width = 100;
    static int height = 250;
}

 

 

width 와 height 의 값을 같이 변하는 것을 알 수 있다 !

 

메소드란 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다 !

높은 재사용성 , 중복된 코드의 제거 , 프로그램의 구조화를 위해 사용한다

다른 언어의 함수같은 역할이라고 이해했다 

 

6. 메소드의 선언과 구현


선언하는 방법

반환타입(없다면 void) 메소드이름 (매개변수선언) {
 내용 입력
 return 결과; (반환타입과 같은 타입이여야함)
}

만약 return 이 없다면 반환 타입에 void 를 넣어주면 된다

 

메소드 호출시에는

메소드이름(매개변수1,매개변수2. . . ); 이렇게 하면 된다

package ch6;

class MyMathTest {
    public static void main(String[] args) {
        MyMath mm = new MyMath();
        long result1 = mm.add(5L,6L);
        long result2 = mm.sub(5L,6L);
        long result3 = mm.multi(5L,6L);
        double result4 = mm.divide(5L,6L);

        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
        System.out.println(result4);
    }

}

class MyMath{
    long add(long a,long b){ //메서드의 선언 (메소드는 클래스 안에만 선언 가능하다)
        long result = a+b;
        return result;
    }
    long sub(long a,long b) {return a-b;}
    long multi(long a,long b) {return a*b;}
    double divide(double a,double b){
        return a/b;
    }
}

7. 클래스 메소드와 인스턴스 메소드 


 

package ch6;

class MyMath2 {
    long a,b;

    long add(){ //인스턴스 메서드
        return a+b; //인스턴스 변수를 사용
    }

    static long add(long a, long b){ //클래스메서드 (static method)
        return a+b; // 지역변수 사용
    }
}

class MyMathTest2 {
    public static void main(String[] args) {
        System.out.println(MyMath2.add(200L,200L)); //클래스 메서드는 별도의 인스턴스 호출 없이 사용 ㅇ
        MyMath2 mm = new MyMath2();//인스턴스 생성
        mm.a = 200L;
        mm.b = 100L;
        System.out.println(mm.add());//인스턴스 메서드 호

    }
}

클래스 메소드는 static 이 붙어있는 메소드다 이것을 별고의 인스턴스 호출 없이 사용이 가능하다

또한 인스턴스 변수를 사용할 수 없다 !!!!

클래스 메소드 -> 인스턴스 없어도 가능

인스턴스변수 -> 인스턴스 없으면 사용 불가능

따라서 클래스 메소드에서 인스턴스 변수를 사용하려고 하면 인스턴스가 생성되어있지 않은 상황일 수 도 있어서 사용이 불가능하다.

 

인스턴스 메소드는 mm이라는 새로운 인스턴스를 생성하고 mm.add 라는 방식으로 호출해서 사용해야한다 !

 

 

8. 생성자


생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드

인스턴스가 생성될 때 실행되어야 할 작업을 위해서도 사용한다.

 

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

2. 생성자는 return 이 없다 (하지만 void 를 사용하지 않음)

 

기본생성자

만약 Card 라는 클래스가 있다면

Card(){ }

이런 아무 내용 없는 기본 생성자는 보통 컴파일러가 자동적으로 추가해준다 (클래스에 정의된 생성자가 하나도 없을때만 컴파일러가 자동적으로 추가해줌)

 

9. this


 

package ch6;

class Car2{
    String color;
    int door;

    Car2() {
        this("white",4); //this 를 사용해 Car2(String color,int door) 얘를 불러옴

    } //빈 생성자로 생성 가능하게끔
    Car2(String color,int door){ //생성자 넣고도 만들 수 있게뜸
        this.color = color;
        this.door =door;
    }//this , this() 는 완전 다른거다!!!!
}
public class CarTest2 {
    public static void main(String[] args) {
        Car2 c1 = new Car2();

        Car2 c2 = new Car2("Blue",2);//더욱 간결한 코드가 된다!!!! 따라서 생성자를 만드는게 좋다
        System.out.println("C1 >> "+c1.color+"  "+c1.door);
        System.out.println("C2 >> "+c2.color+"  "+c2.door);
    }
}

 

반응형
Comments