본문 바로가기

Archived(CSE Programming)/Java

Java_다형성과 컬렉션

# 다형성

객체의 다형성 - 상속 타입에서 부모의 타입으로 자식의 인스턴스를 담을 수 있도록 하기

메소드의 다형성 - 상속 관계에서 오버로딩이 아닌, 오버라이딩을 메소드의 다형성으로 보기(재정의)

매개변수의 다형성 - 메소드 호출 시 매개변수 타입으로 부모 타입으로 지정해서 자식 타입으로 처리할 수 있도록 하기

# 추상화

추상화를 정리하기 위해서는 추상 클래스, 인터페이스에 대해서 이해하기

(차이점 - 추상클래스는 객체들의 공통점을 찾아 추상화시키는 것 / 인터페이스는 객체들의 공통 동작을 강제하는 것)

 

abstract 통해 추상메소드 마킹

인터페이스는 약속이다 ex) 우리가 빔프로젝트한테 리모콘이라는 약속을 통해 동작을 강제할 수 있다

인터페이스는 상수와 추상메소드만 가질 수 있다(보통 상수는 잘 안씀)

implements를 통해 인터페이스를 구현할 시 추상메소드를 오버라이딩해야 한다..!

# 은닉화

정보와 객체 타입 숨기기

결합도 높아지면 안된다(수정이 다른 객체에 영향)

 

cf. IOC(Inversion Of Control) 제어의 역행

매번 필요할 때마다 인스턴스 만들면 성능 저하

 

이제 개발자는 객체 생성하지 말고 클래스만 설계

싱글톤 - 의존성 주입 통해 객체 만들어서 넘겨줌

 

cf. 자바에서는 업무로직을 담당하는 1패턴을 Bean이라고 표현(BeanFactory)

# 싱글톤

싱글톤 클래스에서 한 번만 메모리를 할당 후 메모리에 인스턴스를 만들어 필요할 때마다 반환해 사용하는 디자인패턴

import com.sinc.intern.tv.factory.BeanFactory;
import com.sinc.intern.tv.util.TV;

public class TvMain {

	public static void main(String[] args) {
		
		// BeanFactory
		BeanFactory factory = BeanFactory.getInstance();
		TV tv = factory.getBrand("samsung");
		tv.turnOn();
		
		TV tv2 = factory.getBrand("lg");
		tv2.turnOn();
	}
}
package com.sinc.intern.tv.factory;

import com.sinc.intern.tv.model.vo.LgTV;
import com.sinc.intern.tv.model.vo.SamsungTV;
import com.sinc.intern.tv.util.TV;

public class BeanFactory {
	
	private static BeanFactory instance;
	private TV [] ary;
	
	// Constructor(싱글톤 적용)
	private BeanFactory() {
		ary = new TV[2] ;
		ary[0] = new SamsungTV();
		ary[1] = new LgTV();
	}
	
	public static BeanFactory getInstance() {
		if(instance == null)
			instance = new BeanFactory();

		return instance;
	}
	
	public TV getBrand(String brand) {
		return (brand.equals("samsung")) ? ary[0] : ary[1] ;
	}
}

# Collection API

java.utils.* 유용하게 사용할 수 있는 API들(배열의 확장)

배열 [] , 단일타입, fixed size(resizing 불가), 객체로 취급, length, index는 0부터

 

https://woongsin94.tistory.com/219?category=736756

 

Java 컬렉션(Collection)

자바의 Collection은 대표적으로 List, Set, Map(위에서는 상속하고있지만 Collection으로 분류) 이렇게 제시한다. 1. List List는 순서를 보장하는 데이터들의 집합(중복 허용). 1) Vector 동기화 처리가 보장되..

woongsin94.tistory.com

Java는 이러한 배열을 클래스(인터페이스)로 제공

list(ArrayList, LinkedList, Vector) , set(HashSet) , map(HashMap) 

cf. char형은 int형 형변환 가능

 

Object만 담아야 하는데 기본자료형 담을 수 있나

> 8개의 래퍼형 자료 클래스

 

cf. add index는 넣고 나서의 위치

 

제네릭을 사용한 코드 상의 이점 

> 컴파일 시 코드 상의 안정성(다른 타입 방지)
> 불필요한 형 변환 안해도 된다

 

ArrayList vs Vector -> 쓰레드(Vector는 동기화되어 있음)

단일 스레드에서 Vector 사용을 추천, 현업의 멀티스레드 환경에서는 ArrayList 선호

 

ArrayList/Vector 순차 저장의 용도

HashMap 검색의 용도

 

 

 

Map 사용(Map은 굳이 Looping 하지 않는다) 검색의 용도로 활용된다

 

List, HashMap, Iterator 활용하기

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

import com.sinc.intern.oop.model.vo.PersonVO;
import com.sinc.intern.oop.sub.model.VO.EmployeeVO;
import com.sinc.intern.oop.sub.model.VO.StudentVO;
import com.sinc.intern.oop.sub.model.VO.TeacherVO;

public class CollectionMain {

	// 형 변환 발생이 일어나지 않도록 형 지정
	public static void printList(List<PersonVO> list){
		for(PersonVO per : list) {
			System.out.println(per.perInfo());
		}
	}
	
	public static void main(String[] args) {
		// 자료구조화된 배열
		// 하나의 자료형 저장(제네릭스 문법)
		List<PersonVO> list = new Vector<PersonVO>();
		
		list.add(new StudentVO());
		list.add(new TeacherVO());
		list.add(new EmployeeVO());
		printList(list);
		
		//////////////////////////////////////////////
		
		// 검색의 용도에 적절
		Map<String, List<PersonVO>> map = new HashMap<String, List<PersonVO>>();

		// 객체 생성
		StudentVO stu = new StudentVO("윤신웅", 27, 'm', "1994");
		TeacherVO tea = new TeacherVO("윤신웅2", 27, 'm', "자바");
		EmployeeVO emp = new EmployeeVO("윤신웅3", 27, 'm', "개발");
		
		List<PersonVO> insa = new ArrayList<PersonVO>();
		insa.add(stu);	insa.add(tea);	insa.add(emp);
		
		List<PersonVO> sales = new ArrayList<PersonVO>();
		sales.add(stu);	sales.add(tea);	sales.add(emp);
		
		map.put("insa", insa);	map.put("sales", sales);
		printMap(map);
		
		//////////////////////////////////////////////
		Map<String, String> setMap = new HashMap<String, String>();
		setMap.put("id", "swyoon");
		setMap.put("pw", "swyoon");
		setMap.put("name", "윤신웅");
		
		Set<String> keys = setMap.keySet();
		System.out.println(keys);
		
		Iterator<String> setIte = keys.iterator();
		while(setIte.hasNext()) {
			String key = setIte.next();
			System.out.println("key = " + key + ", value = "+ setMap.get(key));
		}
	}
	
	// Map 출력
	public static void printMap(Map<String, List<PersonVO>> map) {
		List<PersonVO> insaList = map.get("insa");
		Iterator<PersonVO> ite = insaList.iterator();
		while(ite.hasNext()) {
			System.out.println( ite.next().perInfo());	
		}
		
		List<PersonVO> salesList = map.get("sales");
	}
}

 

 

package com.sinc.intern.hms.view;

import java.util.Scanner;

public class View {

	public void mainMenu() {
		while (true) {
			System.out.println(" ** Insa Management System ** ");
			System.out.println("1. insert");
			System.out.println("2. single select");
			System.out.println("3. multi select");
			System.out.println("4. update");
			System.out.println("5. delete");
			System.out.println("99. exit");
			System.out.print("choice number > ");
			
			Scanner scan = new Scanner(System.in);
			int cNum = scan.nextInt();
			
			switch(cNum) {
			case 1:
				insert();
				break;
				
			case 99:
				System.exit(1);
			}
		}
	}
	
	public void insert() {
		System.out.println("insert call");
	}
}

 

'Archived(CSE Programming) > Java' 카테고리의 다른 글

Java_Thread  (0) 2020.01.17
Java_예외처리  (0) 2020.01.17
Java_OOP와 다형성  (0) 2020.01.14
Java_자바의 기본  (0) 2020.01.13
Java 깊은 복사와 얕은 복사  (2) 2019.11.03