몰입하며 나아가는 개발이란

Architecture, Desgin Pattern

Object Oriented Programing(객체 지향 프로그래밍)

류하을 2019. 12. 3. 20:48

객체 지향을 이해하기에 앞서

절차지향을 먼저 이해하고 넘어가는것도 좋다.

절차지향은 순서중심 언어이며, (1.선언부 2.초기화 3.입력부 4.처리 5.결과) 의 과정으로 프로그래밍을 한다.

속도는 상당히 좋은편 이지만 코드의 재사용성으로 접근 했을때,

절차지향은 선언부 부터 결과까지 다시 프로그래밍 해야하는 단점이 있다.

 

이 절차지향의 문제점을 장점으로 갖고 있는 프로그래밍이 OOP(Object Oriented Programing)

즉, 객체지향 프로그래밍 이다.

 

절차지향은 순서중심이지만 객체지향은 처리중심이다.

Object Oriented Programing(객체 지향 프로그래밍)

			객체 지향 프로그래밍 구조

			1.은닉성(캡슐화)
			2.상속성
			3.다형성
			
			class 설계
			
			class 클래스 명
			{
				-- 변수부
				접근지정자 변수자료형 변수명;	member 변수
				
				-- 메소드부
				접근지정자 자료형 메소드명(매개변수){
					
				}
			}
			
			변수(객체)를 선언후에 동적할당을 해야 접근가능.
			
			class 변수 -> object(객체), instance(주체)
							실제 메모리 영역 올라가는 변수 	
		
			클래스 명 인스턴트 = new 클래스 명();
			
			인스턴트		-> 	실제영역
			stack			heap

OOP 예제1) 클래스 개념

class MyClass{
	// 변수부(멤버)
	int x, y;
	char c;
	String str;
		
	// 메소드부
	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);
	}	
}

OOP 예제2) 클래스

class TVclass{
	
	String name;
	int channel;
	boolean power;
		
	void setName(String newName) {
		name = newName;
	}
	String getName() {
		return name;
	}
	
	void setChannel(int newChannel) {
		channel = newChannel;
	}
	int getChannel() {
		return channel;
	}
	
	void setPower(boolean pow) {
		power = pow;
	}
	boolean getPower() {
		return power;
	}
}

public class mainClass {

	public static void main(String[] args) {
    
   		// TV (안방, 홀, 내방)
		String name[] = new String[3];
		int channel[] = new int[3];
		boolean power[] = new boolean[3]; 
		
		TVclass tv1, tv2, tv3;		
		tv1 = new TVclass();
		tv2 = new TVclass();
		tv3 = new TVclass();
		
		tv1.setName("LG");
		tv2.setName("Samsung");
		tv3.setName("Daewoo");
		
		tv1.setPower(true);
		tv2.setPower(false);
		tv3.setPower(true);
	}
}

OOP 예제3) 캡슐화(은닉화)

package oop02;

public class mainClass {

	public static void main(String[] args) {
		/*
			1.은닉성(==캡슐화)
			:외부와의 차단으로 변수들을 관리할 수 있다.
			 클래스 내부에서만 접근(처리)이 가능하도록 접근지정자로 제어한다.
			 
			 private(개인적인) -> 멤버변수	setter getter
			 public(대중적인)	 -> 멤버 메소드
			 protected(특정)	- 상속관련

		*/
		
		MyClass cls = new MyClass();
		/* 은닉화 되지 않은 접근.
		cls.number = 1; 
		cls.name = "hgd";
		cls.height = 172.1;
		*/
		cls.input();
		cls.printing();
		
	//	String name = cls.getName();
	//	System.out.println("name = " + name);
	}
}
package oop02;

import java.util.Scanner;

public class MyClass {

	private int number;
	private String name;
	private double height;
	
	public void input() {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("number = ");
		number = sc.nextInt();
		
		System.out.print("name = ");
		name = sc.next();
		
		System.out.print("height = ");
		height = sc.nextDouble();
	}
	
	public String getName() {				// getter
		return name;
	}		
	
	public void setName(String newName) {	// setter
		name = newName;
	}
	
	public void printing() {
		System.out.println("number:" + number + " name:" + name + " height:" + height);
	}
}

OOP 예제4) 상속

-SuperClass

package sup;

// 부모 클래스
public class SuperClass{
	
	private String pri_name;	// 접근금지
	public String pub_name;		// 누구나 접근가능
	protected String pro_name;	// 자식클래스에서만 접근 허용
	
	public SuperClass() {
	}
		
	public String getPri_name() {
		return pri_name;
	}

	public void setPri_name(String pri_name) {
		this.pri_name = pri_name;
	}

	public void Super_method() {
		System.out.println("SuperClass Super_method()");
	}
}

-ChildClass

package child;

import sup.SuperClass;

// java 다중상속 불가
public class ChildClass extends SuperClass{

	public ChildClass() {
	}
	
	public void Child_func() {
		System.out.println("ChildClass Child_func()");
		
	//	pri_name = "";
		pub_name = "";
		pro_name = "";
		
	}
	
	// Over Ride : 상속받은 함수를 재기입
	public void Super_method() {
		super.Super_method();
		System.out.println("ChildClass Super_method()");		
	}
}

-mainClass

package oop03;

import child.ChildClass;

public class mainClass {

	public static void main(String[] args) {
		ChildClass cc = new ChildClass();
		
		cc.Super_method();
		cc.Child_func();
		cc.pub_name = "aaa";
	//	cc.pro_name = "bbb";
		
		
	//	SuperClass sc = new SuperClass();		
	//	sc.Super_method();
	//	sc.Child_func();
	}
}