Daily coding

Java Basic : day 8 - 객체 지향 프로그래밍 Object Oriented Programming 본문

Language/Java_basic

Java Basic : day 8 - 객체 지향 프로그래밍 Object Oriented Programming

sunnnkim 2019. 11. 27. 19:58

** OOP 객체지향 ** 

  :

OOP 객체지향



* 절차지향 : 선언 - 초기화 - 입력 - 처리 - 결과로 프로그래밍이 이루어짐
- 문제점 : 코드가 길고 복잡해질수록 유지보수가 어려움

 

* 객체지향


* 참고 - (AOP : Aspect Oriented Programming)
- 처리 중심의 프로그래밍
    <-> 절차지향 : 순차적 처리
                        속도가 빠르다
- 객체지향은 클래스 설계가 중요함.

** 특징 **
1. 은닉성 (캡슐화)
2. 상속성 
3. 다형성
- 상속성과 다형성은 연관되어 있다


Class 설계 규칙
- 객체(설계부)는 메모리 영역에 올라가지 않는다.
- 실제 데이터를 클래스 설계에 따라 저장하고 싶으면 다른 클래스에서 클래스변수(인스턴스)를  생성해야 한다.

class  클래스명 
{
            -- 변수부 --
            접근지정자(접근제어자) 변수자료형 변수명 ; --> member 변수
            ex)  public int number; 


            -- 함수부 --
            접근지정자(접근제어자) 리턴타입  메소드명(매개변수){
                    처리부분
            }
            ex) public int getNumber(int number){
                        return this.number;
            }
}

   * 변수(객체)를 선언한 후에 동적할당을 해야 접근가능(new로 할당)

class 변수  => object(객체) / 인스턴스instance(주체)
* instance = 실제 메모리영역에 올라가는 변수

클래스명 인스턴스명 = new 클래스명();
// 위의 코드는 기본적인 인스턴스 생성과 초기화 방법
 

 


인스턴스   -> stack 메모리에 존재 (값에 접근하기 위한 참조, 주소값),

                  실제 데이터의 주소값을 가지고 있다.
실제값      -> heap 메모리에 들어가 있음
 

 


 */

클래스변수의 동적할당
MyClass cls; // cls == instance
cls = new MyClass(); // heap에 저장, cls => stack

// MyClass의 변수 및 메소드 접근방법
cls.c='A';
cls.x=12;
cls.func();
cls.method(33);





}


클래스 설계 예시

 


class MyClass{

            // 변수부 (멤버변수)
            int x,y;
            char c;
            String str;
            // 클래스 선언부이기 때문에 변수에 값을 넣으려고 하면 오류가 난다.
            // str = " "; 
            // 위의 코드는 오류가 난다.




            // 메소드부
            public void setX(int x) {
                        this.x = x;
            }
            // 클래스 내부의 메소드는 클래스 내부의 변수에 접근할 수 있다.
            void func() {
                        x = 0;
                        System.out.println("MyClass func()");
            }
            

            void method(int i) {
                        str = "hello";
                        x = i;
                        System.out.println("MyClass method(int i) ");
                        System.out.println("x = " + x);
            }

}

 

 

예시 

 


// TV ( 안방, 거실, 내방) 총 3대가 있을 때 필요한 변수 
// 절차지향일때  
String namp [] = new String[3]; 
int channel [] = new int [3]; 
boolean power[] = new boolean[3]; 


객체지향일때 

// 데이터(변수)에 직접 접근하지 않고 
// getter / setter 메소드를 작성하여 접근한다. 
// 변수에 직접 접근하는 것을 막기위해 제약을 걸어준다. (접근 지정자) 
// 변수이름으로 인해 충돌이 있을 수 있고 절차지향으로 바뀔 수 있기 때문

TVClass tv1 = new TVClass(); 
TVClass tv2 = new TVClass(); 
TVClass tv3 = new TVClass(); 

tv1.setName("LG"); 
tv1.setChannel(15); 
tv1.setPower(true); 

tv2.setName("Samsung"); 
tv2.setChannel(0); 
tv2.setPower(false); 

tv3.setName("Daewoo"); 
tv3.setChannel(32); 
tv3.setPower(true); 

TVClass arr[] = new TVClass[3]; // 클래스 변수는 배열로도 할당할 수 있다.  

// arr[0].setChannel(11); <-- 이렇게 하면 Nullpointer뜸 (동적할당을 안했기 때문) 
arr[0] = new TVClass(); 
arr[1] = new TVClass(); 
arr[2] = new TVClass(); 

arr[0].setChannel(11); // <-- 정상적으로 작성됨 


MyClass cls2 = new MyClass(); 


} 
class TVClass{

String name;
int channel;
boolean power;



            
// setter 만들기 
public void setName(String name) {
            this.name = name;
}
public void setChannel(int channel) {
            this.channel = channel;
}
public void setPower(boolean power) {
            this.power = power;
}

//getter 만들기 
public String getName() {
            return name;
}
public int getChannel() {
            return channel;
}
public boolean isPower() {
            return power;
}


}