OOP: 객체지향 프로그래밍(Object Oriented Programming)

 - 우리 일상에서이루어지고있는 업무를 객체(Object)를 사용해서  프로그래밍하는방법

 - ex)  

*    1. 실제 주차장관리 업무파악

*      (객체를 도출하고 그객체들의 관계에의한 업무파악) 

*    2. 프로그램으로 작성 

*      (1번에서 파악된업무를 메모리상에서 그대로구현) 

*   

*    ex> 주차관리 프로그램 

*     

*   - 객체(업무):실제이루어지고있는 업무(주차장)에서 보여지고구체화되어있는 사물(차)    

*   

*   - 객체(프로그램):실제이루어지고있는 업무(주차장)에서 보여지고

*                  구체화되어있는 사물을 메모리의 데이타로

*                  표현한것(차의데이타)


OOP 의 원칙 

1. 캡슐화

2. 상속성

3. 다형성(오버로딩,오바라이딩,객체형변환)





//------ Car.java ------

/*TIP:
 * class 선언
 *  - 형식
 *       접근제한자  class  클래스이름{
 *       	- 접근제한자:public,protected,없는거
 *       
 *       } 
 *       ex> public class Car{
 *           }
 *           
 *  -구성요소
 *     1.멤버변수선언(속성)
 *        접근제한자(public,proected,없는거,private) 타입 indentifier;
 *        ex> public String carName;
 *        
 *     2.멤버메쏘드 선언(행위)    
 *        접근제한자 리턴타입 메쏘드이름(인자){
 *           -인자: 나를 호출한놈이 데이타를 넣어줄 통로
 *        	 -리턴타입: 나를 호출한놈에게 줄 데이타타입 
 *                     void --> 줄데이타가 없는경우
 *        }
 *        ex> public int test(int a){
 *        	  	
 *            }
 */

/**
 * 
 * 이 클래스는 Car 클래스이다.
 * 차 번호와 입차, 출차시간, 요금을 받는다.
 * @author : SUIN
 * @version: ver0.1
 *
 */
public class Car {
	/**
	 * 차량의 번호
	 */
	public String no ;
	public int inTime;
	public int outTime;
	/** 요금저장 */
	public int fee;
}

//------ CarMain.java ------

 

public class CarMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1. 차가 들어온다. (입차)
			//변수선언 : 타입 식별자 -> Car 타입
		
		//차 클래스 사용해서 차 객체 생성 후 Car 변수 초기화
			//*Car 타입의 기억장소 c1이라는 식별자 할당, 
			//*Car 클래스(틀)을 활용해서 객체 생성
		
		Car c1 = new Car(); //차 객체 찍기
		
		//차 객체 안의 멤버변수 초기화
		c1.no ="1234";
		c1.inTime = 12;
		c1.outTime = 0;
		c1.fee = c1.outTime - c1.inTime;
		
		//시간이 흐른 후 (2hr)
		
		//2. 요금계산
		c1.outTime = 14;
		c1.fee = (c1.outTime - c1.inTime)*1000;
		
		//3. 출력
		System.out.println("****************");
		System.out.println("차량번호: "+c1.no
				+"\n입차시간: "+c1.inTime
				+"\n출차시간: "+c1.outTime
				+"\n주차요금: "+c1.fee+"원");
		System.out.println("****************");
		
		/*****************************************/
		//String str;
		
		Car c2 = new Car(); 
		c2.no ="4962";
		c2.inTime = 14;
		c2.outTime = 0;
		c2.fee = 0;
		c2.outTime = 17;
		c2.fee = (c2.outTime - c2.inTime)*1000;

		System.out.println("****************");
		System.out.println("차량번호: "+c2.no
				+"\n입차시간: "+c2.inTime
				+"\n출차시간: "+c2.outTime
				+"\n주차요금: "+c2.fee+"원");
		System.out.println("****************");
	}

}
 

//------ CarMethod.java ------

/* class 선언
 *  - 형식
 *       접근제한자  class  클래스이름{
 *       	- 접근제한자:public,protected,없는거
 *       
 *       } 
 *       ex> public class Car{
 *           }
 *           
 *  -구성요소
 *     1.멤버변수선언(속성)
 *        접근제한자(public,proected,없는거,private) 타입 indentifier;
 *        ex> public String carName;
 *        
 *     2.멤버메쏘드 선언(행위)    
 *        접근제한자 리턴타입 메쏘드이름(인자){
 *           -인자: 나를 호출한놈(클래스,객체)이 데이타를 넣어줄 통로
 *        	 -리턴타입: 나를 호출한놈에게 줄 데이타타입 
 *                     void --> 줄데이타가 없는경우
 *        }
 *        ex> public int test(int a){
 *        	  	
 *            }
 */
/**
 * @author : SUIN
 * @since 201302
 * 
 */
public class CarMethod {
/**
 * 차량의 번호 : String 형태
 */
	public String no ;
	/**
	 * 입차시간
	 */
	public int inTime;
	public int outTime;
	public int fee;
	public static int moneyPerHour = 1000;
	
	/*
	 * 기능 (메서드)
	 * 1. 요금을 계산하다
	 * 2. 출력하다
	 */

	
	//요금 계산
	/**
	 * 요금 계산 메소드
	 */
	public void calculateFee() {
		this.fee = (this.outTime - this.inTime)*moneyPerHour;
		//같은 클래스 안에서는 자기자신의 레퍼런스이므로 this. 해주면 됨. 
		//안해줘도 default 로 생략가능.(처음엔 생략하지 말 것)
		// this = 셀프참조변수
	}
	
	//출력
	/**
	 * 차량의 주차정보 출력 메소드
	 */
	public void print(){
		System.out.println("****************");
		System.out.println("차량번호: "+this.no
				+"\n입차시간: "+inTime
				+"\n출차시간: "+outTime
				+"\n주차요금: "+fee+"원");
		System.out.println("****************");
	}
	
	//초기화
	/**
	 * 차량의 데이터를 SET 
	 * 
	 * @param no :차량 번호 입력
	 * @param inTime :입차시간 
	 * @param outTime :출차시간
	 * @param fee :주차요금
	 * 
	 */
	public void setData(String no, int inTime, int outTime, int fee){
		this.setNo(no);
		this.setInTime(inTime);
		this.setOutTime(outTime);
		this.setFee(fee);
	}

	/*
	 * 멤버필드 데이터 메소드(set, get)
	 * 1. setter method
	 * 2. getter method
	 */
	//setter method
	public void setNo (String no){ //검정은 로컬변수
		this.no = no;	//파랑은 멤버(전역)변수
				//
	}
	public void setInTime(int inTime){
		this.inTime = inTime;
	}
	public void setOutTime(int outTime){
		this.outTime = outTime;
	}

	public void setFee(int fee) {
		this.fee = fee;
	}

	//getter method
	/**
	 * 차량 번호를 반환하는 메소드
	 * @return 
	 */
	public String getNo (){ //get : 다른 클래스(사용자) 입장에서 get
		return this.no;
	}
	public int getInTime (){
		return this.inTime;
	}

	public int getOutTime() {
		return outTime;
	}

	public int getFee() {
		return fee;
	}
		//Source - Generate getter and setter -> 자동으로 만들어줌. 대박!

}

//------ CarMethodMain.java ------

public class CarMethodMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1. 차가 들어온다. (입차)
			//변수선언 : 타입 식별자 -> Car 타입
		
		//차 클래스 사용해서 차 객체 생성 후 Car 변수 초기화
			//*Car 타입의 기억장소 c1이라는 식별자 할당, 
			//*Car 클래스(틀)을 활용해서 객체 생성
		
		CarMethod c1 = new CarMethod(); //차 객체 찍기
		
		//차 객체 안의 멤버변수 초기화
		c1.no ="3456";
		c1.inTime = 12;
		c1.outTime = 0;
		c1.fee = 0;
		
		//시간이 흐른 후 (2hr)
		c1.outTime = 14;
		//2. 요금계산
				c1.outTime = 14;
				c1.fee = (c1.outTime - c1.inTime)*1000;
				
				//3. 출력
				System.out.println("****************");
				System.out.println("차량번호: "+c1.no
						+"\n입차시간: "+c1.inTime
						+"\n출차시간: "+c1.outTime
						+"\n주차요금: "+c1.fee+"원");
				System.out.println("****************");
		
				
			/******************클래스에 메소드추가***************************/
		CarMethod c2 = new CarMethod(); //번지수 입력, this = c2의 주소
		c2.no ="1212";
		c2.inTime = 13;
		c2.outTime = 0;
		c2.fee = 0;
		c2.outTime = 17;
		c2.calculateFee(); //요금 계산 함수
		c2.print(); //요금 출력 -> 우와 편해졌다! 

		
			/********************getter,setter*************************/
		CarMethod c3 = new CarMethod();
		//데이터에 관련된 메소드. setter method, getter method
		//1. 입차
		c3.setData("1234", 16, 0, 0);
		
		//2. 시간이 흐른 후
		c3.setOutTime(17);
		c3.calculateFee();
		
		//3. 출력
		c3.print();
		
		//*.번호 알아보기
		String no = c3.getNo();
		System.out.println("no="+no);

		/*
		 * Car 클래스를 사용하는 사용자에게 
		 * Car 클래스의 멤버에 대해 설명하지 않아도 됨.
		 * 메소드만 설명하면 되고, 사용자가 멤버변수를 몰라도 됨.
		 * 
		 *  => 다른 클래스, 객체의 멤버변수 접근을 막는다. 
		 */
		
		//시간당 요금 출력
		System.out.println("시간당 요금: "+CarMethod.moneyPerHour);
			}
}

//------ MemberField.java ------

public class MemberField {

	//선언과 동시에 초기화 가능
	/*
	 * 객체 생성 후 멤버변수의 초기 기본값
	 * 
	 * 참조변수 (클래스변수, 객체변수)	: null
	 * integer								: 0
	 * boolean 							: false
	 * double							:0.0
	 * 
	 */
	public String member1 = "멤버변수연습";
	public int member2 = 130222;
	public char member3 ;
	public boolean member4 ;
	public float member5 ;
	  
	
}

//------ MemberFieldMain.java ------

public class MemberFieldMain {

	public static void main(String[] args) {
		
		/*선언*/
		MemberField mf; 
		//MemberField.class가 존재해야 레퍼런스 변수 선언 가능
		//선언하면 멤버필드 템플릿이 메모리 위로 올라옴.
		//mf = MemberField 객체의 주소값을 가짐
		
		/*초기화*/
		mf = new MemberField();
		// 보통 선언과 동시에 초기화 MemberField mf = new MemberField();

		/*
		 * << 멤버(객체)변수  접근 방법 >>
		 * 
		 *  - 참조변수.멤버변수의 식별자
		 *  
		 *  ex> Student st = new Student();
		 *  	st.no = 1234;
		 * 
		 */
		mf.member1 ="문자열";
		mf.member3='c';
		mf.member5=3.14159f;
		
		System.out.println(mf.member1);
		System.out.println(mf.member2);
		System.out.println(mf.member3);
		System.out.println(mf.member4);
		System.out.println(mf.member5);
				
				//tip: Ctrl+마우스 왼클릭 = 해당 변수가 정의 된 곳으로 이동
				//tip: Ctrl+Alt+↓,↑ = 해당 드래그 된 내용 복사 붙여넣기

	}
}

//------ MemberMethod.java ------

/*
          
 *  -구성요소
 *     1.멤버변수선언(속성)
 *        접근제한자(public,protected,없는거,private) 타입 indentifier;
 *        ex> public String carName;
 *        
 *     2.멤버메쏘드 선언(행위)    
 *        접근제한자 리턴타입 메쏘드이름(인자){
 *           -인자: 나를 호출한놈이 데이타를 넣어줄 통로
 *        	 -리턴타입: 나를 호출한놈에게 줄 데이타타입 
 *                     void --> 줄데이타가 없는경우
 *        }
 *        ex> public int test(int a){
 *        	  	
 *            }
 *            
 *            //리턴타입과 메쏘드이름 사이는 떨어지면 안된다.
 */

public class MemberMethod {
	
	public void method1 () {
		System.out.println("method1()실행");
	}
	public void method2 (int a){
		System.out.println("method2(int a)실행: "+a);
	}
	public void method3(int a, int b){
		System.out.println("method3(int a, int b)실행: "+a+","+b);
	}
	public int method4 (int a){
		a = a+1;
		System.out.print("mothod4(int a)실행: ");
		return a;
	}
	public int method5 (int a, int b){
		int result = a+b ;
		System.out.print("mothod5(int a, int b)실행: ");
		
		return result;
	}
}

//------ MemberMethodMain.java ------

public class MemberMethodMain {

	public static void main(String[] args) {

		MemberMethod mm = new MemberMethod();
		/*
		 * 멤버(객체)메쏘드에 접근하는방법
		 * 
		 * -형태: 참조(객체)변수.메쏘드이름();
		 * ex> mm.method1();
		 */
		
		mm.method1();
		mm.method2(3);
		mm.method3(1, 2);
		
		int result = mm.method4(999);
		System.out.println(result);
		/*
		 * public int method5(int x, int y);
		 */
		result = mm.method5(34, 34457833);
		System.out.println(result);
	}
}