2023.03.22 : java (instance of, 형변환, 인터페이스, 컬렉션, stack, queue

이준영·2023년 3월 22일
0

instance of

객체 타입을 확인하여 true/false로 반환해주는 연산자
객체 instance of 클래스 << 형식으로 쓰인다.


자동형변환과 강제형변환


자동형변환 - 부모타입의 참조변수에 자식 객체 주소를 넣는 행위

Parent p1 = new child();

-> 이 경우 p1은 부모타입 + 자식타입의 재정의된 것들만 사용 가능 , 자기(자식) 메소드나 필드 사용 불가능

강제형변환 - 자기(자식) 메소드나 필드를 사용해야 할 경우 강제로 캐스팅을 해준다.
이때 확인을 위하여 조건문에 instance of를 써서 검사

모든 부모타입을 자식 클래스 타입으로 강제변환 할 수 있는 것이 아님
부모 타입인 자식 객체(자동형변환된)를 다시 자식 타입으로 변환을 해야 할 때 사용 가능

Parent p1 = new Child();
Child c1 = (Child) p1;



추상(공통) 클래스 (abstraction)

공통된 필드와 메서드 이름 통일한 목적으로 사용

추상클래스 - 상속을 전제로 만든 클래스, 추상 메서드를 가질 수 있음(필수 아님, 없어도 됨), 추상 메서드를 만들 경우 언젠가는 상속 클래스를 통하여 구현을 해줘야 한다.

abstract class 클래스이름 {   (불완전 클래스)

abstract 리턴타입 메서드이름(매개변수 ..);  --> 추상 메서드를 선언한다면 상속을 통하여 구현해줘야 함! (안 할 시 에러 발생)

}
클래스이름 객체변수 = new 생성자() x -> 이렇게 직접적으로 인스턴스화 불가능

자식을 통해서 생성 가능 ( 자신의 메서드, 필드 자식 통해서 호출 가능 )

일반클래스는 추상 메서드를 가질 수 없다.
추상메서드 - 내용이 선언되지 않은 메서드

책 270~275 참조 ↓ (비주얼 스튜디오 기준 추상클래스 설명)



{}만 있다면 메서드 역할이나, 없으면 역할 불가.



abstract를 통하여 가능(추상 메서드 생성된 것), 일반 클래스는 추상 메서드를 가질 수 없다.



상속된 자식 클래스를 통하여 추상 메서드 재정의하여 구현



인스턴스화 불가능하나 상속은 가능 : 상속을 통하여 자식을 통하여 만들기는 가능



자식 클래스가 추상메서드를 사용하지 않는다면 손자(자식의 자식) 클래스가 추상메서드를 선언해야 한다.




인터페이스(interface)

일반 메서드를 가질 수 없이 추상 메서드만 존재하고 있는 것
상속을 전제로 만들어 짐

인터페이스가 가질 수 있는 것 - 상수, 추상메서드

선언

interface 인터페이스명 {}

구현클래스 선언

일반클래스 implements 인터페이스명, 인터페이스명 {}  --> 인터 페이스 상속, 여러개 받기 가능

일반클래스 extends 부모클래스 implements 인터페이스명, 인터페이스명 {}  --> 이렇게 사용도 가능

비쥬얼 스튜디오에서 코딩한 것




이클립스로 인터페이스와 구현 클래스 만들기

  1. 인터페이스 만들기



2.구현클래스 만들기



3.메인 클래스에서 구현 클래스 호출하기



출력 결과




다중 인터페이스 구현 클래스

  1. 인터페이스 inter A 생성


  1. interA를 상속한 interB 생성(implement아닌 extends로)


  1. Parent 부모 클래스 생성


  1. Parent를 상속받고 interA , interB로 구현된 Child 생성(다중 인터페이스, 상속)


  1. 메인 클래스에서 생성 후 호출




enum : 열거 타입

서로 연관된 상수의 집합을 저장하는 자료형 (298, 299 읽고 필기)

선언 방법


enum의 메서드

enum타입들은 java.lang.Enum 클래스를 기본적으로 상속받고 있기 때문에 java.lang.Enum 클래스에 선언된 메서드 사용 가능

name() --> enum 상수 이름을 문자열로 리턴
ordinal() --> ()부터 시작하는 enum 상수 순서 리턴



어노테이션

주석의 개념, @ 붙여서 사용

컴파일러에게 문법 에러를 체크하도록 정보 제공
코드를 자동으로 생성할 수 있도록 정보 제공
실행시(런타임시)특정 기능을 실행하도록 정보를 제공


자바에서 적용되는 내장 어노테이션(일부분)

@Override
선언한 메서드가 오버라이드 되었다는 것 표시
만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생

@Deprecated
해당 메서드가 더 이상 사용되지 않음 표시
만약 사용할 경우 컴파일 경고 발생



Vector

ArrayList와 동일한 내부 구조 가지고 있음 (기능은 같다)
List 자체에 ArrayList나 Vector로 객체를 만들어서 사용해도 된다.

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class ArrayList5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList<String> al = new ArrayList<>();
		al.add("홍길동");
		al.add("박문수");
		al.add("이몽룡");
		
		System.out.println(al);
	
		al.remove(0);
		
		System.out.println(al);
		
		//ArrayList와 동일한 내부 구조 가지고 있음
		Vector<String> v = new Vector<>();
		v.add("홍길동");
		v.add("박문수");
		v.add("이몽룡");
		
		System.out.println(v);
		
		v.remove(0);
		
		System.out.println(v);
		
		// 다형, 추상의 원리
		List<String> l1 = new ArrayList<>();
		// == List<String> l1 = new Vector<>();
		l1.add("홍길동");
		l1.add("박문수");
		l1.add("이몽룡");
		
		System.out.println(l1);
	}
}



LinkedList

ArrayList와 사용방법은 똑같으나, 내부 구조가 다르다.

ArrayList는 중간 인덱스 객체를 제거하면 뒤의 객체 인덱스가 1씩 앞당겨진다.



Set 컬렉션

순서가 없고 중복을 허용하지 않는다.
동일 판별하는 것으로 equals 메서드를 사용한다.
컬렉션 중 HashSet을 가장 많이 사용한다.


HashSet

Set 인터페이스의 구현 클래스
중복은 포함하지 않는다.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSet1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HashSet<String> hs1 = new HashSet<>();
		Set<String> hs2 = new HashSet<>();
		
		hs1.add("홍길동");
		hs1.add("박문수");
		hs1.add("이몽룡");
		
		System.out.println(hs1);
		System.out.println(hs1.size());
		
		hs1.add("홍길동");
		hs1.add("장길산");
		
		//중복 제거되어 출력
		System.out.println(hs1);
		
		// 전체 데이터를 가져오는 방법
		Iterator<String> i = hs1.iterator();
		while(i.hasNext()) {
			System.out.println(i.next());
		}
		//향상된 for문
		for(String str : hs1) {
			System.out.println(str);
		}
	}
    }



HashSet을 이용하여 중복 없는 로또 만들기

ArrayList로 만들 방법도 고민해보자

import java.util.HashSet;
import java.util.Random;

public class HashsetLotto {

	public static void main(String[] args) {
		Random r = new Random(System.currentTimeMillis());
		
		HashSet<Integer> lottos = new HashSet<>();
		
		for(int i =1 ; i<=5; i++) {
			while(true) {
				lottos.add(r.nextInt(45) + 1);
				if(lottos.size() == 6) {
					break;
					}
				}
			System.out.println(lottos.toString());
			
			lottos.clear();
			}
		}
	}



Map 컬렉션

키와 값으로 구성
키는 중복 저장될 수 없지만 값은 중복 저장 가능하다.
기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 수정됨
list나 set add와 다르게 put 사용

import java.util.HashMap;

public class HashMap1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//HashMap<키의 데이터 타입,  데이터 타입>
		HashMap<String, String> hm = new HashMap<>();
		
		hm.put("a", "홍길동");
		hm.put("b", "박문수");
		hm.put("c", "이몽룡");
		
		System.out.println(hm);
		System.out.println(hm.size());
		
		hm.put("d", "장길산");
		
		System.out.println(hm);
		//기존 값 있으면 수정함
		hm.put("c", "임꺽정");
		
		System.out.println(hm);
		//하나씩 가지고 올 때는 get() 사용
		System.out.println(hm.get("a"));
		System.out.println(hm.get("b"));
        
		//제거
		hm.remove("c");
		System.out.println(hm);
		
		//전체제거
		hm.clear();
		System.out.println(hm);
	}
}



키만 가져오기 / 값만 가져오기

import java.util.Collection;
import java.util.HashMap;
import java.util.Set;

public class HashMap2 {

	public static void main(String[] args) {
		HashMap<String, String> hm = new HashMap<>();
		
		hm.put("a", "홍길동");
		hm.put("b", "박문수");
		hm.put("c", "이몽룡");
		
		//키만 가져오기
		Set<String> keys = hm.keySet();   --> 키 값만 가져옴
		System.out.println(keys);
		
		//전체 데이터
		for(String key : keys) {
			System.out.println(key + " : " + hm.get(key));
		}
		
		Collection<String> values = hm.values();   --> 값만 가져옴
		for(String value : values) {
			System.out.println(value);
		}
	}
}



Properties

HashMap 계열로, HashMap과 거의 차이는 없지만 Properties 클래스는 파일 입출력을 지원한다.

import java.util.Enumeration;
import java.util.Properties;
import java.util.Set;

public class Properties1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// HashMap 계열, 대부분 문자열 들어가서 어노테이션 없다
		Properties prop = new Properties();
		
		prop.setProperty("timeout", "30");
		prop.setProperty("language", "kr");
		prop.setProperty("size", "10");
		
		System.out.println(prop);
		System.out.println(prop.size());
		
		//키 값만 가져오기
		Enumeration e = prop.propertyNames();
		while(e.hasMoreElements()) {
			System.out.println(e.nextElement());
		}
		
		Set<String> names = prop.stringPropertyNames();
		for(String name : names) {
			System.out.println(name);
		}
	}

}


시스템 정보 얻기

import java.util.Properties;
import java.util.Set;

public class Properties2 {

	public static void main(String[] args) {
		// 시스템이 가지고 있는 properties 정보 얻음
		Properties prop = System.getProperties();
		
		Set<String> names = prop.stringPropertyNames();
		for( String name : names) {
			System.out.println(name);
		}
		// 	Eclipse JRE 버전 출력
		System.out.println(System.getProperty("java.version"));
	}
}

위의 더 많은 정보가 있다.



stack / queue

stack

vector 상속
후입선출(LIFO), 먼저 들어간 것이 아래에 쌓이는 것( 나중에 들어온 것이 먼저 나감)
push로 추가하고 pop으로 빼기
EX> 뒤로 가기

import java.util.Stack;

public class stack1 {

	public static void main(String[] args) {
		// stack 구조
		Stack<String> stack = new Stack<>();
		
		stack.push("홍길동");
		stack.push("박문수");
		stack.push("이몽룡");
		System.out.println(stack);
		
		//맨 마지막에 있는 것(이몽룡) 뽑음
		System.out.println(stack.pop());
		//뺀 나머지 출력
		System.out.println(stack);
	}
}

queue

linkedlist 가지고 queue 만듦
선입선출(FIFO), 먼저 들어간 것이 먼저 나가는 것
offer로 추가하고 poll로 빼기
/ EX> 문자 메세지, 프린터 출력

import java.util.LinkedList;
import java.util.Queue;

public class queue1 {

	public static void main(String[] args) {
		// queue 구조
		Queue<String> queue = new LinkedList<>();
		
		queue.offer("홍길동");
		queue.offer("박문수");
		queue.offer("이몽룡");
		System.out.println(queue);
		//앞의 것(홍길동) 빠짐
		System.out.println(queue.poll());
		// 뺀 나머지 출력
		System.out.println(queue);

	}

}



profile
끄적끄적

0개의 댓글