본문 바로가기
카테고리 없음

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 [4주차]

by 소윤:) 2022. 7. 7.
반응형
객체 지향 핵심

6. 상속을 사용하는 경우

  • IS-A관계 : 일반적인(general) 개념과 구체적인(specific) 개념과의 관계로 상위클래스는 하위 클래스보다 일반적인 개념, 하위클래스는 상위 클래스보다 구체적인 개념들이 더해짐
  • 상속은 클래스간의 결합도가 높은 설계
  • HAS-A관계 : 클래스가 다른 클래스를 포함하는 관계로 코드 재사용의 가장 일반적인 방법으로 상속하지 않음

7. 다운캐스팅과 instanceof

업캐스팅된 클래스를 다시 원래의 타입으로 형 변환하는 것으로 하위클래스로의 형 변환은 명시적으로 해야 함

public void testDownCasting(ArrayList<Animal> list) {
	for(int i=0;i<list.size();i++) {
		Animal animal = list.get(i);
		if(animal instanceof Human) {
			Human human=(Human)animal;
			human.readBook(); 
		}			
		else if(animal instanceof Tiger) {
			Tiger tiger=(Tiger)animal;
			tiger.hunting();
		}
		else if(animal instanceof Eagle) {
			Eagle eagle=(Eagle)animal;	
			eagle.flying();
		}
		else {
			System.out.println("unsupported type");
		}
	}
}

8. 추상 클래스

구현 코드 없이 메서드의 선언만 있는 추상 메서드를 포함한 클래스

추상 클래스는 인스턴스화 할 수 없음

메서드에 구현 코드가 없으면 abstract 로 선언

모든 메서드가 구현된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음

  • 예제

package ch09;

public abstract class Computer {
	
	public abstract void display();
	public abstract void typing();
	
	void turnOn() {
		System.out.println("On");
	}
	void turnOff() {
		System.out.println("Off");
	}
}
package ch09;

public class Desktop extends Computer {

	@Override
	public void display() {
		System.out.println("Desktop display");		
	}
	@Override
	public void typing() {
		System.out.println("Desktop typing");		
	}
	@Override
	void turnOff() {
		System.out.println("Turn off");	
	}
}
package ch09;

public abstract class NoteBook extends Computer {

	@Override
	public void display() {
		System.out.println("NoteBook display");		
	}
}
package ch09;

public class MyNoteBook extends NoteBook {

	@Override
	public void typing() {
		System.out.println("MyNoteBook typing");				
	}	
}
package ch09;

public class ComputerTest {

	public static void main(String[] args) {
		Computer desktop=new Desktop();
		desktop.display();
	}
}

9. 템플릿 메서드 패턴

추상 메서드나 구현된 메서드를 활용하여 코드의 흐름을 정의하는 메서드로 final로 선언하여 하위 클래스에서 재정의할 수 없게 함

추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현

 

10. 인터페이스

클래스나 프로그램이 제공하는 기능을 명시적으로 선언하는 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세

모든 메서드가 추상 메서드로 선언 public abstract

모든 변수는 상수로 선언 public static final

interface 인터페이스 이름{

    public static final float pi = 3.14F;
    public void makeSomething();
}

상속에서의 형 변환과 동일한 의미, 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음

형 변환되는 경우 인터페이스에 선언된 메서드만을 사용가능

하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있음 ( 다형성)

  • 인터페이스를 활용한 dao구현하기

자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스로 여러 인터페이스 구현 가능

디폴트 메서드가 중복되는 경우 구현하는 클래스에서 재정의

여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능

 

  • 여러 인터페이스 구현

package ch15;

public interface Buy {
	void buy();
	
	default void order() {
		System.out.println("buy order");
	}
}
package ch15;

public interface Sell {
	void sell();
	
	default void order() {
		System.out.println("sell order");
	}
}
package ch15;

public class Customer implements Buy, Sell {

	@Override
	public void sell() {
		System.out.println("customer sell");
	}

	@Override
	public void buy() {
		
		System.out.println("customer buy");	
	}

	@Override
	public void order() {
		Buy.super.order();
	}

	public void hello() {
		System.out.println("Hello");
	}
}
package ch15;

public class CustomerTest {

	public static void main(String[] args) {
		
		Customer customer=new Customer();
		customer.buy();
		customer.sell();
		customer.order();
		customer.hello();
		
		Buy buyer=customer;
		
		buyer.buy();
		buyer.order();

		Sell seller=customer;
		
		seller.sell();
		seller.order();
	}
}

인터페이스 사이에 상속 사용가능, extends 키워드 사용

 

11. Object 클래스

모든 클래스의 최상위 클래스

java.lang 패키지 : 프로그래밍시 import하지 않아도 자동으로 import (import.java.lang.*;)

모든 클래스는 Object클래스를 상속받음

 

12. toString() 메서드 

객체의 정보를 String으로 바꾸어서 사용할때 쓰임

package ch01;

class Book{
	
	private String title;
	private String author;
	
	public Book(String title, String author) {
		this.title=title;
		this.author=author;
	}

	@Override
	public String toString() {
		
		return title+", "+author;
	}	
}
public class BookTest {

	public static void main(String[] args) {
		
		Book book=new Book("데미안","헤르만 헤세");
		
		System.out.println(book);
		
		String str=new String("test");
		System.out.println(str);
	}
}

13. equals() 메서드

두 인스턴스의 주소값을 비교하여 true/false를 반환

인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있음

 

14. hashCode() 메서드

인스턴트의 저장 주소를 반환

 

15. clone() 메서드

객체의 원본을 복제하는데 사용

생성과정의 복잡한 과정을 반복하지 않고 복제 가능

package ch02;

public class Student implements Cloneable{
	
	private int studentNum;
	private String studentName;
	
	public Student(int studentNum, String studentName) {
	
		this.studentNum=studentNum;
		this.studentName=studentName;
	}

	public void setStudentName(String name) {
		this.studentName=name;
	}
	
	public String toString() {
		return studentNum +", "+studentName;
	}
	
	@Override
	public boolean equals(Object obj) {

		if(obj instanceof Student) {
			Student std=(Student)obj;
			if(this.studentNum==std.studentNum)
				return true;
		}
		return false;
	}
	
	@Override 
	public int hashCode() {
		return super.hashCode();
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
}

16. text block 

""" """ 사이에 html, json 문자열을 만드는데 유용하게 사용

package ch03;

public class TextBlockTest {

	public static void main(String[] args) {

		String textBlocks="""
				Hello,
				Hi,
				how are u""";
					
		System.out.println(textBlocks);
		System.out.println(getBlockOfHtml());
	}
	
	public static String getBlockOfHtml() {
		return """
				<html>
					<body>
						<span>example text</span>
					</body>
				</html>
				""";
	}
}

 

17. Class 클래스
자바의 모든 클래스와 인터페이스는 컴파일 후 class파일이 생성
Class 클래스는 컴파일 된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공
newInstance() 메서드로 new키워드를 사용하지 않고 클래스 정보를 활용하여 인스턴트 생성 가능

 

반응형