상속
상속이란?
- 부모 클래스를 상속받은 자식(하위) 클래스는 부모(상위) 클래스의 속성과 기능도 이용
- 자바에서는 단일 상속만 지원
상속의 필요성
- 기존의 검증된 class를 이용해서 빠르고 쉽게 새로운 class를 만들 수 있다.
상속 구현
extend키워드
를 이용해서 상속을 구현
부모 클래스의 private 접근자
- 자식 클래스는 부모 클래스의 모든 자원을 사용할 수 있지만, private 접근제어자의 속성과 메소드는 사용할 수 없다.
상속 특징
메서드 오버라이드(override)
- 부모(상위) 클래스의 기능을 자식(하위) 클래스에서 재정의해서 사용한다.
자료형(타입)
- 기본 자료형처럼 클래스도 자료형이다.
Object 클래스
- 모든 클래스의 최상위 클래스는 Object 클래스이다.
ctrl + t
: 상속관계 보기
super 클래스
- 상위 클래스를 호출할 때
super 키워드
를 이용한다.
내부 클래스와 익명 클래스
내부(inner) 클래스
- 클래스 안에 또 다른 클래스를 선언하는 것으로 이렇게 하면 두 클래스의 멤버에 쉽게 접근할 수 있다.
- 현재는 실무에서 많이 사용하지 않는 방식이다.
익명(anonymous) 클래스
- 이름이 없는 클래스로 주로 메소드를 재정의하는 목적으로 사용된다.
- 익명 클래스는 인터페이스나 추상클래스에서 주로 이용된다.
인터페이스
인터페이스란?
- 클래스와 달리 객체를 생성할 수는 없으며, 클래스에서 구현해야 하는 작업 명세서
인터페이스를 사용하는 이유
- 인터페이스를 사용하는 이유는 많지만, 가장 큰 이유는 객체가 다양한 자료형(타입)을 가질 수 있기 때문이다.
인터페이스 구현
class
대신interface 키워드
를 사용하며,extend
대신Implements
키워드를 이용한다.- interface를 이용하면 객체가 다양한 자료형(타입)을 가질 수 있다.
추상클래스
추상클래스란?
- 클래스의 공통된 부분을 뽑아서 별도의 클래스(추상클래스)로 만들어 놓고, 이것을 상속해서 사용한다.
abstract 클래스의 특징
- 멤버변수를 가진다.
- abstract 클래스를 상속하기 위해서는
extends
를 이용한다. - abstract 메서드를 가지며, 상속한 클래스에서 반드시 구현해야 한다.
- 일반 메서드도 가질 수 있다.
- 일반 클래스와 마찬가지로 생성자도 있다.
추상클래스 구현
- 클래스 상속과 마찬가지로 extends 키워드를 이용해서 상속하고 abstract(추상) 메서드를 구현한다.
인터페이스 vs 추상클래스
- 공통점
- 추상메서드를 가진다.
- 객체 생성이 불가하여 자료형(타입)으로 사용된다.
- 차이점
- 인터페이스
- 상수, 추상메서드만 가진다.
- 추상 메서드를 구현만 하도록 한다.
- 다음형을 지원한다.
- 추상클래스
- 클래스가 가지는 모든 속성과 기능을 가진다.
- 추상 메서드 구현 및 상속의 기능을 가진다.
- 단일 상속만 지원한다.
- 인터페이스
람다식
람다식이란?
- 익명함수(anonymous function)를 이용해서 익명 객체를 생성하기 위한 식이다.
람다식 구현
- 람다식은 기본적으로 함수를 만들어 사용한다고 생각하면 된다.
public static void main(String[] args) {
// 매개변수와 실행문만으로 작성한다.(접근자, 반환형, return 키워드 생략)
LambdaInterface1 li1 = (String s1, String s2, String s3) -> { System.out.println(s1 + " " + s2 + " " + s3); };
li1.method("Hello", "java", "World");
System.out.println();
// 매개변수가 1개이거나 타입이 같을 때, 타입을 생략할 수 있다.
LambdaInterface2 li2 = (s1) -> { System.out.println(s1); };
li2.method("Hello");
// 실행문이 1개일 때, '{}'를 생략할 수 있다.
LambdaInterface2 li3 = (s1) -> System.out.println(s1);
li3.method("Hello");
// 매개변수와 실행문이 1개일 때, '()'와 '{}'를 생략할 수 있다.
LambdaInterface2 li4 = s1 -> System.out.println(s1);
li4.method("Hello");
// 매개변수가 없을 때, '()'만 작성한다.
LambdaInterface3 li5 = () -> System.out.println("no parameter");
li5.method();
// 반환값이 있는 경우
LambdaInterface4 li6 = (x, y) -> {
int result = x + y;
return result;
};
System.out.printf("li6.method(10, 20) : %d\n", li6.method(10, 20));
li6 = (x, y) -> {
int result = x * y;
return result;
};
System.out.printf("li6.method(10, 20) : %d\n", li6.method(10, 20));
li6 = (x, y) -> {
int result = x - y;
return result;
};
System.out.printf("li6.method(10, 20) : %d\n", li6.method(10, 20));
}
문자열 클래스
String 객체와 메모리
- 문자열을 다루는 String 클래스(객체)는 데이터가 변화하면 메모리상의 변화가 많아 속도가 느리다.
- 문자열이 변경되면 기존의 객체를 버리고, 새로운 객체를 메모리에 생성한다. 이때, 기존 객체는
GC(가비지컬렉터)
에 의해서 메모리 회수가 이루어진다.
StringBuffer, StringBuilder
- String 클래스의 단점을 보완한 클래스로 데이터가 변경되면 메모리에서 기존 객체를 재활용한다.
- 문자열이 변경되면 기존의 객체를 재활용한다.
- 속도는 StringBuilder가 조금 더 빠르며, 데이터 안정성은 StringBuffer가 조금 더 좋다.
public static void main(String[] args) {
// String
// String str = "java";
String str = new String("java");
str = str + " world";
System.out.println("str : " + str);
System.out.println();
// StringBuffer
StringBuffer sf = new StringBuffer("java");
System.out.println("sf : " + sf);
System.out.println("sf.length() : " + sf.length()); //문자열 길이
sf.append(" world"); //문자열 추가
System.out.println("sf : " + sf);
sf.insert(4, "~~~~"); //4번째 문자다음에 삽입
System.out.println("sf : " + sf);
sf.insert(sf.length(), "!!"); //문자열끝에 삽입
System.out.println("sf : " + sf);
sf.delete(4, 8); //4번째부터 8번째까지 삭제
System.out.println("sf : " + sf);
sf.delete(sf.length()-2, sf.length()); //뒷에서 2번째 문자부터 2글자 삭제
System.out.println("sf : " + sf);
sf.deleteCharAt(4); //4번째 문자 제거
System.out.println("sf : " + sf);
System.out.println();
// StringBuilder
StringBuilder sd = new StringBuilder("java");
sd.append(" world"); //문자열 추가
System.out.println("sd : " + sd);
System.out.println("sd.length() : " + sd.length()); //문자열 길이
sd.append(" world"); //문자열 추가
System.out.println("sd : " + sd);
sd.insert(4, "~~~~"); //4번째 문자다음에 삽입
System.out.println("sd : " + sd);
sd.insert(sd.length(), "!!"); //문자열끝에 삽입
System.out.println("sd : " + sd);
sd.delete(4, 8); //4번째부터 8번째까지 삭제
System.out.println("sd : " + sd);
sd.delete(sd.length()-2, sd.length()); //뒷에서 2번째 문자부터 2글자 삭제
System.out.println("sd : " + sd);
sd.deleteCharAt(4); //4번째 문자 제거
System.out.println("sd : " + sd);
}
Collections(컬렉션)
List
- List는 인터페이스로 이를 구현한 클래스는 인덱스를 이용해서 데이터를 관리한다.
- 인덱스를 이용한다.
- 데이터 중복이 가능하다.
Map
- Map은 인터페이스로 이를 구현한 클래스는 key르 이용해서 데이터를 관리한다.
- key를 이용한다.
- key는 중복될 수 없다.
public static void main(String[] args) {
// ArrayList 객체 생성
ArrayList<String> list = new ArrayList<String>();
System.out.println("list.size : " + list.size());
// 데이터 추가
list.add("Hello");
list.add("Java");
list.add("World");
System.out.println("list.size : " + list.size());
System.out.println("list : " + list);
list.add(2, "Programing"); // 추가
System.out.println("list : " + list);
list.set(1, "C"); // 변경
System.out.println("list : " + list);
// 데이터 추출
String str = list.get(2);
System.out.println("list.get(2) : " + str);
System.out.println("list : " + list);
// 데이터 제거
str = list.remove(2);
System.out.println("list.remove(2) : " + str);
System.out.println("list : " + list);
// 데이터 전체 제거
list.clear();
System.out.println("list : " + list);
// 데이터 유무
boolean b = list.isEmpty();
System.out.println("list.isEmpty() : " + b);
System.out.println(" ==================================== ");
// HashMap 객체 생성
HashMap<Integer, String> map = new HashMap<Integer, String>();
System.out.println("map.size() : " + map.size());
// 데이터 추가
map.put(5, "Hello");
map.put(6, "Java");
map.put(7, "World");
System.out.println("map : " + map);
System.out.println("map.size() : " + map.size());
map.put(8, "!!");
System.out.println("map : " + map);
// 데이터 교체
map.put(6, "C");
System.out.println("map : " + map);
// 데이터 추출
str = map.get(5);
System.out.println("map.get(5) : " + str);
// 데이터 제거
map.remove(8);
System.out.println("map : " + map);
// 특정 데이터 포함 유무
b = map.containsKey(7);
System.out.println("map.containsKey(7) : " + b);
b = map.containsValue("World");
System.out.println("map.containsValue(\"World\") : " + b);
// 데이터 전체 제거
map.clear();
System.out.println("map : " + map);
// 데이터 유무
b = map.isEmpty();
System.out.println("map.isEmpty() : " + b);
}
'언어 > JAVA' 카테고리의 다른 글
JAVA- 제어문 (0) | 2019.12.02 |
---|---|
자바란 (0) | 2019.11.30 |
javadoc이란? (0) | 2019.10.01 |
[MyBatis] include refid 사용하기 (0) | 2019.09.25 |
protected 접근 제한자 (0) | 2019.09.24 |