본문 바로가기
JAVA SE/Code

CODE [20.07.23/Day_11] Java SE / Method, Static, Abstract, Interface 인터페이스

by 파프리카_ 2020. 7. 23.
728x90
반응형

[ Method ]

 

메서드에 리턴값이 없을 때, void를 명시한 경우의 사용과

메서드에 리턴타입이 명시되고 리턴값이 있을 떄 사용되는 경우의 특징을 공부하는 예제

 

VO class

/ATM.java

public class ATM {
	int money;
	
	// 입금 메서드 - 	
	public void deposit(int money) {
		// money에 입금받는 money만큼이 추가가 됨
		this.money += money;
	}
	
	// 출금 메서드 
	public int withdraw(int money) {
		// money에 출금하는 money만큼 감소가 됨
		this.money -= money;
		return money;
	}
}
  • deposit : 입금 메서드 
    리턴값이 필요가 없으므로 void로 선언
  • withdraw : 출금 메서드 
    리턴 값이 필요 ←돈이 필요하기 때문에
    * money의 타입이 int이므로 void대신 리턴값의 형(int) 로 명시한다

 

main class

/ TestATM.java

public class TestATM {
	public static void main(String[] args) {
		ATM atm = new ATM();

		// 고객이 200을 입금한다
		atm.deposit(200); // money = 200

		// 고객이 100을 출금한다
		int total = atm.withdraw(100); // total = 100

		System.out.println("잔고에 남은 금액: "+total);
		
		//아래와 같이 바로 출력 가능
		System.out.println("잔고에 남은 금액: "+atm.withdraw(100));
		
		/* 출력:
		 * 잔고에 남은 금액 : 100
		 * 100
		 */
	}
}
  • atm.deposit(200);
    deposit void 메서드는 실행하고 반환값은 없음
  • int total = atm.withdraw(100);
    withdraw함수는 리턴값이 있으므로 출금액을 반환받아 변수(total)에 저장

 


[ Static ]

class Person{
	// class의 member
	// 별도의 객체 생성없이 사용 가능
	static int age = 21;
	public static void eat() {
		System.out.println("static eat");
		// play(); //error : non-static error
		// static eat()메서드는 객체 생성없이 실행가능하고,
		// play() 메서드는 반드시 객체가 생성되어야만 실행하기 때문에 compile error가 발생한다
		
	}
	
	// non-static 즉, Object의 멤버(메서드)는 객체 생성이 필요하다
	public void play() {
		System.out.println("object play");
		eat(); // 되는 이유는 play()가 실행되었따는 것은, 객체 생성을 전재로 하고,
		// 객체 생성 전에 class loading이 일어나기 때문에 당연히 접근 가능
	}
}
public class TestStatic2 {
	public static void main(String[] args) {
		//age는 static이므로 별도의 객체 생성없이 사용할 수 있다
		// 프로그램 실행 시 첫시점에 class loading이 되고, 그 때 static이 메모리에 적재된다
		System.out.println(Person.age);
		Person.eat();
		/* 출력값:
		 * 21
		 * static eat
		 */
		
		//Person.play(); //error : Object의 멤버이므로 객체 생성 필요
		Person p = new Person();
		p.play(); // 객체 생성 후 메소드 사용 가능
		/* 출력값:
		 * object play
		 * static eat
		 */
	}
}

 

 

parseInt(String s) 예제 

public class TestStatic3 {
	public static void main(String[] args) {
		String s1 = "1";
		int s2 = 8;
		
		//문자열이 앞에 나오면 이후 연산은 문자열로 인식
		System.out.println(s1+s2); //18
		
		//문자열을 String을 정수로 변환
		// java.lang.Integer의 static method인 parseInt(String s)을 
		// 활용해서 문자열을 정수로 변환
		int i = Integer.parseInt(s1); //1(int type)
		System.out.println(i + s2); // 9
	}
}

 

static의 누적을 보여주는 예제

package step3;

class Fish{
	// Object의 member로 객체 생성시 
	// heap영역의 각자 객체 공간에 새롭게 각각 초기화
	int count;
	
	// 실행 첫 시점에 class loading때, static이 초기화됨
	// method area(class area)영역에 하나의 공간에 저장됨
	static int scount;
	
	Fish () {
		count++;
		scount++;
	}
}

public class TestStatic4 {
	public static void main(String[] args) {
		Fish f1 = new Fish();
		System.out.println(f1.count);
		System.out.println(f1.scount);
		Fish f2 = new Fish();
		System.out.println(f2.count);
		System.out.println(f2.scount);
		Fish f3 = new Fish();
		System.out.println(f3.count);
		System.out.println(f3.scount);
		
		/* 출력값:
		 * 1
		 * 1
		 * 1
		 * 2
		 * 1
		 * 3
		*/
		}
	}


[ Abstract ]

 

예제 1)

main class

public class TestAbstract1 {
	public static void main(String[] args) {
		// abstract class이므로, 직접 객체 생성이 안된다
		// Parent p = new Parent();

		// 간접 생성 방법
		Child c = new Child();
		/*
		 * 출력값: Parent 객체 생성 
		 * Child 객체 생성
		 */

		c.study(); // 자식 클래스에서 오버라이딩된 메서드
		/*
		 * 출력값: Child 공부하다
		 */

		c.eat(); // 부모 클래스 메서드
		/*
		 * 출력값: 먹다
		 */
	}
}

 

VO class

abstract 부모클래스 | Parent.java

//abstract method가 하나 이상 존재하면 그 클래스는 
//abstract로 선언되아야 한다.
abstract class Parent {
	public void eat() {
		System.out.println("먹다");
	}
	
	// abstract 메서드는 구현부{}를 가질 수 없다
	// 오직 선언만 한다
	public abstract void study();
}

 

자식클래스 | Child.java

class Child extends Parent {

	// 생성자
	public Child() {
		super(); // 부모클래스 생성자 구현
		System.out.println("Child 객체 생성");
	}

	// 자식클래스에 구현 강제
	@Override
	public void study() {
		System.out.println("Child 공부하다");
	}

}

 

 

예제 2) Template Method Design Pattern

main class

/TestPizzaService.java

package step8;

import step7.PotatoPizzaService;

public class TestPizzaService {
	public static void main(String[] args) {
		//포테이토 피자를 만들기 위해 메서드 호출
		PotatoPizzaService potato = new PotatoPizzaService();
		potato.makePizza();
		System.out.println("=========================");
		
		//씨푸드 피자도 만들어보자
		SeaFoodPizzaService seafood = new SeaFoodPizzaService();
		seafood.makePizza();
		
		/* 출력값:
		 * 도우를 만들다
		 * 감자 토핑을 올리다
		 * 굽다
		 * 자르다
		 * 포장하다
		 * =========================
		 * 도우를 만들다
		 * 해산물 토핑을 올리다
		 * 굽다
		 * 자르다
		 * 포장하다
		 */
	}
}

 

 

VO class

/PizzaService.java - super class(abstract) 

package step6;
/*
 * abstract class
 * : 자식에게 유용한 멤버를 상속시킬 뿐,
 * 스스로 직접 객체화되지 않는다.
 * 오로지 자식 객체 생성을 통해서만 객체생성이 가능하다
 */

public abstract class PizzaService {
	protected void preparing() {
		System.out.println("도우를 만들다");
	}
	
	// 부모차원에서 구현할 수 없고,
	// 반드시 자식클래스에서 구현해야 하는 메서드
	// abstract method로 선언한다
	protected abstract void topping();
	
	protected void baking() {
		System.out.println("굽다");
	}
	protected void cutting() {
		System.out.println("자르다");
	}
	protected void  boxing() {
		System.out.println("포장하다");
	}
	
	public void makePizza() {
		preparing();
		topping();
		baking();
		cutting();
		boxing();
		
	}
}

 

 

/PotatoPizzaService.java - sub class 1

package step7;

import step6.PizzaService;

public class PotatoPizzaService extends PizzaService{
	@Override
	protected void topping() {
		System.out.println("감자 토핑을 올리다");
	}
}

 

 

/SeaFoodPizzaService.java - sub class 2

package step8;

import step6.PizzaService;

public class SeaFoodPizzaService extends PizzaService{
	@Override
	public void topping() {
		System.out.println("해산물 토핑을 올리다");
	}
}

 


[ Interface ] 

 

 

728x90
반응형