DINGA DINGA
article thumbnail
728x90

상속 및 클래스 (2)

추상클래스

- 추상클래스란?

클래스의 공통된 부분을 뽑아서 별도의 클래스(추상클래스)로 만들어 놓고, 이것을 상속해서 사용함.

 

abstract 클래스의 특징

  • 멤버변수를 가진다.
  • abstract 클래스를 상속하기 위해서는 extends를 이용한다.
  • abstract 메서드를 가지며, 상속한 클래스에서 구현해야 한다.
  • 일반 메서드도 가질 수 있다.
  • 일반 클래스와 마찬가지로 생성자도 있다.

- 추상클래스 구현

클래스 상속과 마찬가지로 extends 키워드를 이용해 상속하고 abstract(추상) 메서드를 구현함.

 

- Bank 추상클래스 예제

public abstract class Bank {

	String name;
	String account;
	int totalAmount;
	
	public Bank() {
		System.out.println("Bank constructor");
	}
	
	public Bank(String name, String account, int totalAmount) {
		System.out.println("Bank constructor");
		
		this.name = name;
		this.account = account;
		this.totalAmount = totalAmount;
	}
	
	// 예금
	public void deposit() {
		System.out.println(" -- deposit() START -- ");
	}
	
	// 출금
	public void withdraw() {
		System.out.println(" -- withdraw() START -- ");
	}
	
	// 적금
	public abstract void installmentSavings();
	
	// 해약
	public abstract void cancellation();
	
	// 정보출력
	public void getInfo() {
		System.out.printf("name : %s\n", name);
		System.out.printf("account : %s\n", account);
		System.out.printf("totalAmount : %d\n", totalAmount);
	}
}

 

Bank를 extends 하는 MyBank 클래스

public class MyBank extends Bank {

	public MyBank(String name, String account, int totalAmount) {
		super(name, account, totalAmount);
	}
	
	@Override
	public void installmentSavings() {
		System.out.println(" -- installmentSavings() START -- ");
	}

	@Override
	public void cancellation() {
		System.out.println(" -- cancellation() START -- ");
	}

}

 

MainClass

public class MainClass {

	public static void main(String[] args) {
		
		Bank myBank = new MyBank("박찬호", "123-4567-89012", 10000);
		
		myBank.deposit();				// 예금
		myBank.withdraw();				// 출금
		myBank.installmentSavings();	// 적금
		myBank.cancellation();			// 해약
		
		System.out.println();
		
		myBank.getInfo();
		
	}
	
}

실행결과

 

- 인터페이스 vs 추상클래스

공통점, 차이점

 

람다식

- 람다식이란?

익명 함수(anonymous function)을 이용해서 익명 객체를 생성하기 위한 식

 

기존 방법: InterfaceType 변수 <-할당(대입)-- Interface 구현

람다식 방법: InterfaceType 변수 <-할당(대입)-- Lambda Expressions

 

- 람다식 구현

람다식은 기본적으로 함수를 만들어 사용한다고 생각하면 됨

// 매개변수와 실행문만으로 작성한다.(접근자, 반환형, 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가 조금 더 좋음.

StringBuffer, StringBuilder

 

Collections

- List

List는 인터페이스로, 이를 구현한 클래스는 인덱스를 이용해 데이터를 관리함.

데이터 중복이 가능함.

// ArrayList 객체 생성
ArrayList<String> list = new ArrayList<String>();

// 데이터 추가
list.add("Hello");
list.add("Java");
list.add("World");
list.add(2, "Programing");
list.set(1, "C");

// 데이터 추출
String str = list.get(2);

// 데이터 제거
str = list.remove(2);

// 데이터 전체 제거
list.clear();

// 데이터 유무
boolean b = list.isEmpty();

 

- Map

Map을 구현한 클래스는 key를 이용해 데이터를 관리함.

Key는 중복될 수 없음.

데이터 중복이 가능함.

HashMap 이용

// HashMap 객체 생성
HashMap<Integer, String> map = new HashMap<Integer, String>();

// 데이터 추가
map.put(5, "Hello");
map.put(6, "Java");
map.put(7, "World");
map.put(8, "!!");

// 데이터 교체
map.put(6, "C");

// 데이터 추출
str = map.get(5);

// 데이터 제거
map.remove(8);

// 특정 데이터 포함 유무
b = map.containsKey(7);
b = map.containsValue("World");

// 데이터 전체 제거
map.clear();

// 데이터 유무
b = map.isEmpty();

 

JAVA 마무리

예외처리

- 예외란?

프로그램에 문제가 있는 것을 말하며, 예외로 인해 시스템 동작이 멈추는 것을 막는 것을 '예외처리'라고 함.

 

Exception: 소프트웨어적으로 구현이 잘못된 경우. 개발자가 대처 가능.

    - Checked Exception: 예외처리를 반드시 해야 하는 경우 (네트워크, 파일 시스템 등)

    - Unchecked Exception: 예외처리를 개발자의 판단에 맡기는 경우 (데이터 오류 등)

Error: 개발자가 대처할 수 없음.

 

- Exception 클래스

하위 클래스로 NullPointerException, NumberFormatException 등이 있음.

 

- try ~ catch

개발자가 예외처리하기 가장 쉽고, 많이 사용되는 방법

try {
	예외가 발생할 수 있는 코드
} catch (Exception e) {
	예외가 발생했을 때 처리할 코드
}

 

- 다양한 예외처리

Exception 및 하위 클래스를 이용해 다양한 예외처리 가능

try {
System.out.println("input i : ");
i = scanner.nextInt();
System.out.println("input j : ");
j = scanner.nextInt();
System.out.println("i / j = " + ( i / j));

for (int k = 0; k < 6; k++) {
System.out.println("iArr["+ k + "] : " + iArr[k]);
}
System.out.println("list.size() : " + list.size());

} catch (InputMismatchException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

 

- finally

예외 발생 여부와 상관없이 반드시 실행됨.

 

- throws

예외 발생 시 예외처리를 직접 하지 않고 호출한 곳으로 넘김.

MainClass004 mainClass004 = new MainClass004();
try {
mainClass004.firstMethod();
} catch (Exception e) {
e.printStackTrace();
}

public void firstMethod() throws Exception {
secondMethod();
}

public void secondMethod() throws Exception {
thirdMethod();
}

public void thirdMethod() throws Exception {
System.out.println("10 / 0 = " + ( 10 / 0 ));
}

 

입력과 출력

- 입/출력이란?

입력(Input): 다른 곳의 데이터를 가져오는 것 (파일 읽기, 이미지&동영상 불러오기 등)

출력(Output): 다른 곳으로 데이터를 내보내는 것 (파일 쓰기, 이미지&동영상 내보내기 등)

 

- 입/출력 기본 클래스

입/출력에 사용되는 기본 클래스는 1byte 단위로 데이터를 전송하는 InputStream, OutputStream이 있음.

 

- FileInputStream / FileOutputStream

파일에 데이터를 읽고 쓰기 위한 클래스

read(), write() 메서드를 이용함.

 

- 파일 복사

파일 입/출력 클래스를 이용해서 파일을 복사할 수 있음.

 

- DataInputStream, DataOutputStream

byte 단위의 입출력을 개선해 문자열을 좀 더 편리하게 다룰 수 있음.

DataInputStream, DataOutputStream

 

- BufferedReader, BufferedWriter

byte 단위의 입출력을 개선해서 문자열을 좀 더 편리하게 다룰 수 있음.

BufferedReader, BufferedWriter

 

네트워킹

- 네트워크 데이터 입력 및 출력

네트워크 대상(객체) 사이 입/출력(InputStream, OutputStream)을 이용해 데이터를 입력하고 출력함.

 

- 소켓(Socket)

네트워크상에서 데이터를 주고받기 위한 장치

소켓 (Socket)

 

- Socket 클래스

서버는 클라이언트를 맞을 준비를 하고 있다가 클라이언트의 요청에 반응함.

클라이언트-서버

 

- Client와 Server 소켓(Socket)

서버에 ServerSocket을 준비하고 클라이언트에서 Socket을 이용해 접속함.

클라이언트-서버

 

- 양방향 통신

클라이언트와 서버는 InputStream, OutputStream을 이용해 양방향 통신 가능

양방향통신

728x90

'JAVA > Study' 카테고리의 다른 글

객체 (2) & 상속 및 클래스 (1)  (0) 2021.07.18
기초 문법 (2) & 객체 (1)  (0) 2021.07.11
Java 개발 환경 구축 & 기초 문법 (1)  (1) 2021.07.01