객체 타입을 확인하여 true/false로 반환해주는 연산자
객체 instance of 클래스 << 형식으로 쓰인다.
Parent p1 = new child();
-> 이 경우 p1은 부모타입 + 자식타입의 재정의된 것들만 사용 가능 , 자기(자식) 메소드나 필드 사용 불가능
강제형변환 - 자기(자식) 메소드나 필드를 사용해야 할 경우 강제로 캐스팅을 해준다.
이때 확인을 위하여 조건문에 instance of를 써서 검사
모든 부모타입을 자식 클래스 타입으로 강제변환 할 수 있는 것이 아님
부모 타입인 자식 객체(자동형변환된)를 다시 자식 타입으로 변환을 해야 할 때 사용 가능
Parent p1 = new Child();
Child c1 = (Child) p1;
공통된 필드와 메서드 이름 통일한 목적으로 사용
추상클래스 - 상속을 전제로 만든 클래스, 추상 메서드를 가질 수 있음(필수 아님, 없어도 됨), 추상 메서드를 만들 경우 언젠가는 상속 클래스를 통하여 구현을 해줘야 한다.
abstract class 클래스이름 { (불완전 클래스)
abstract 리턴타입 메서드이름(매개변수 ..); --> 추상 메서드를 선언한다면 상속을 통하여 구현해줘야 함! (안 할 시 에러 발생)
}
클래스이름 객체변수 = new 생성자() x -> 이렇게 직접적으로 인스턴스화 불가능
자식을 통해서 생성 가능 ( 자신의 메서드, 필드 자식 통해서 호출 가능 )
일반클래스는 추상 메서드를 가질 수 없다.
추상메서드 - 내용이 선언되지 않은 메서드
책 270~275 참조 ↓ (비주얼 스튜디오 기준 추상클래스 설명)
{}만 있다면 메서드 역할이나, 없으면 역할 불가.
abstract를 통하여 가능(추상 메서드 생성된 것), 일반 클래스는 추상 메서드를 가질 수 없다.
상속된 자식 클래스를 통하여 추상 메서드 재정의하여 구현
인스턴스화 불가능하나 상속은 가능 : 상속을 통하여 자식을 통하여 만들기는 가능
자식 클래스가 추상메서드를 사용하지 않는다면 손자(자식의 자식) 클래스가 추상메서드를 선언해야 한다.
일반 메서드를 가질 수 없이 추상 메서드만 존재하고 있는 것
상속을 전제로 만들어 짐
인터페이스가 가질 수 있는 것 - 상수, 추상메서드
선언
interface 인터페이스명 {}
구현클래스 선언
일반클래스 implements 인터페이스명, 인터페이스명 {} --> 인터 페이스 상속, 여러개 받기 가능
일반클래스 extends 부모클래스 implements 인터페이스명, 인터페이스명 {} --> 이렇게 사용도 가능
비쥬얼 스튜디오에서 코딩한 것
2.구현클래스 만들기
3.메인 클래스에서 구현 클래스 호출하기
출력 결과
서로 연관된 상수의 집합을 저장하는 자료형 (298, 299 읽고 필기)
선언 방법
enum타입들은 java.lang.Enum 클래스를 기본적으로 상속받고 있기 때문에 java.lang.Enum 클래스에 선언된 메서드 사용 가능
name() --> enum 상수 이름을 문자열로 리턴
ordinal() --> ()부터 시작하는 enum 상수 순서 리턴
주석의 개념, @ 붙여서 사용
컴파일러에게 문법 에러를 체크하도록 정보 제공
코드를 자동으로 생성할 수 있도록 정보 제공
실행시(런타임시)특정 기능을 실행하도록 정보를 제공
@Override
선언한 메서드가 오버라이드 되었다는 것 표시
만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생
@Deprecated
해당 메서드가 더 이상 사용되지 않음 표시
만약 사용할 경우 컴파일 경고 발생
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);
}
}
ArrayList와 사용방법은 똑같으나, 내부 구조가 다르다.
ArrayList는 중간 인덱스 객체를 제거하면 뒤의 객체 인덱스가 1씩 앞당겨진다.
순서가 없고 중복을 허용하지 않는다.
동일 판별하는 것으로 equals 메서드를 사용한다.
컬렉션 중 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);
}
}
}
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();
}
}
}
키와 값으로 구성
키는 중복 저장될 수 없지만 값은 중복 저장 가능하다.
기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 수정됨
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);
}
}
}
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"));
}
}
위의 더 많은 정보가 있다.
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);
}
}
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);
}
}