일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- playground배열
- 허스켈그래프
- 오블완
- 등록금0원
- 제거된값 첨부하기
- 2023채용박람회
- 아이엔이야기
- wxmaxima
- 숫타니파아타
- 맥북에서 wxMaxima 설치
- 나르시스트
- 오일러투어
- 합의정리
- kgol
- 최단경로문제
- 이분그래프
- 정보처리기사공부방법
- 직선의방정식
- 배윤슬
- 집착형
- 그래프2
- 윤파고
- 티스토리챌린지
- 이런 사람에게 "절대" 돈과 시간 쓰지 마세요. (이헌주 교수 3부)
- 데이터베이스시스템
- 다자녀장학금
- 쌍대성원리
- 무소의뿔
- 청년도배사 이야기
- wxMaxima install for mac os
- Today
- Total
사적공간
인터페이스 구문 / 컬렉션 / 예외처리 본문
인터페이스
-오직 추상 메서드와 상수만을 멤버로 가질 수 있다.
-자바의 다형성과 유지보수성을 높이기 위해 있음.
interface A {
void fn(); //메서드 내부는 정의하지 않음.
}
class B implements A{ //인터페이스 클래스를 상속받음.
public void fn(){
System.out.println("B");
}
}
class C implements A{ //일반 (추상)클래스는 extends로 상속받음.
public void fn(){
System.out.println("C");
}
}
class Main{
public static void main(String args[]){
A b = new B();
A c = new C();
b.fn();
c.fn();
}
}
B
C
스레드
-스레드는 프로세스보다 가벼운, 독립적으로 수행되는 순차적인 흐름제어(단위)
-Tread 클래스를 상속받고, run()메서드에 스레드 동작 . 시수행할 코드를 작성(run 메서드 오버라이딩)
class T_Main extends Thread{
public void run(){
System.out.println("Run");
}
}
public class Main{
public static void main(String[] args){
Thread t1 = new T_Main(); // Thread 스레드변수 = new 상속받은 스레드 클래스();
Thread t2 = new Thread(new T_Main()); // Thread 스레드 변수 =new Thread(new 상속받은 스레드 클래스())
t1.start(); // t1의 run() 매서드 실행
t2.start(); // t2의 run() 매서드 실행
System.out.println("Main");
}
}
Run
Main
Run
"Main"이 "Run" 출력 사이에 위치하는 이유는 멀티스레딩 환경에서 스레드들이 동시에 실행되기 때문입니다. 주 스레드(main 메서드가 실행되는 스레드)에서 `t1.start()`와 `t2.start()`가 호출되면, `t1`과 `t2` 스레드가 병렬적으로 실행됩니다. 이때 `t1` 스레드는 "Run"을 출력하고, `t2` 스레드도 "Run"을 출력한 후에, 마지막으로 주 스레드가 "Main"을 출력하게 됩니다. 따라서 "Main"이 "Run" 사이에 위치하는 것입니다. 이는 멀티스레딩 환경에서 스레드들이 병렬적으로 실행되기 때문에 발생하는 현상입니다.
이 코드에서 T_Main 클래스는 Thread 클래스를 상속하고 있으며 run() 메서드를 오버라이드하고 있습니다. T_Main 클래스의 인스턴스를 생성하여 스레드로 실행하는 것과 T_Main 객체를 Thread 클래스의 생성자에 전달하여 스레드로 실행하는 것 두 가지 방법이 있습니다. 두 경우 모두 스레드가 실행되고 run() 메서드가 호출됩니다.
t1.start() 호출 시:t1은 T_Main 클래스의 인스턴스를 가리키고 있습니다.이 인스턴스의 run() 메서드가 호출되어 "Run"이 출력됩니다.t2.start() 호출 시:t2는 Thread 클래스의 인스턴스를 가리키고 있습니다.T_Main 클래스의 인스턴스를 생성하여 Thread 클래스의 생성자에 전달했습니다.이 생성자는 Runnable을 인자로 받으므로 T_Main 클래스의 인스턴스가 Runnable로 쓰레드에 전달됩니다.그러면 Thread 내부에서는 run() 메서드가 실행됩니다.따라서 여기서도 "Run"이 출력됩니다.
Runnable 인터페이스 상속
class T_Main implements Runnable{
public void run(){
System.out.println("Run");
}
}
public class Main{
public static void main(String[] args){
Thread t = new Thread(new T_Main());
t.start();
System.out.println("Main");
}
}
Run
Main
컬렉션 프레임워크(Collection Framework)
-컬렉션 프레임워크는 다수의 데이터를 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합이다.
-메모리 낭비를 방지하고, 동적인 크기로 변경가능
-자료구조 형태인 리스트, 셋, 맵 등을 클래스로 구현함
-대량의 데이터를 일관된 인터페이스를 제공해 쉽고 효율적으로 작성가능
자바 LinkedList
선언방법은 타입없는 방법과 있는 방법이 있다.
List 변수명 = new LinkedList( );
List<자료형>변수명 = new List<자료형>( );
import java.util.List;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
List<String> list = new LinkedList<String>(); //String 타입을 갖는 링크드 리스트 객체 list 생성
list.add("Hi"); //Hi 문자열을 리스트 0번 리스트에 추가
list.add("Hello"); //
System.out.println(list); // 현재 리스트 출력
list.add(1, "goodbye");// 해당 인덱스에 값 추가
list.add(2, "goodbye2");
list.add(3, "goodbye");
list.remove(0); // 해당 인덱스 값 삭제
System.out.println(list.get(2)); //리스트 2번 인덱스에 값 출력
System.out.println(list.size());// 현재 리스트의 사이즈 출력
System.out.print(list); //현재 리스트 출력
}
}
[Hi, Hello]
goodbye
4
[goodbye, goodbye2, goodbye, Hello]
자바 ArrayList
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main (String[] args) {
List a = new ArrayList(); // a 라는 변수에 ArrayList 클래스 생성
a.add(2);
System.out.println(a);
a.add(1);
System.out.println(a);
a.add(1);
System.out.println(a);
a.add(1,3);
System.out.println(a);
a.remove(2);
System.out.println(a.get(2));// 인덱스 2에 있는 값 출력
System.out.println(a.size());
}
}
[2]
[2, 1]
[2, 1, 1]
[2, 3, 1, 1]
1
3
자바 HashSet
-HashSet은 Set의 자식클래스로 중복된 원소를 허용하지 않는 집합의 성질을 가지고 있는 자료형(클래스)다.
-LinkedList처럼 자료형 있는 선언과 없는 선언있음.
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main (String[] args){
Set h = new HashSet(); // h 변수에 HashSet 클래스 생성
h.add(2);
System.out.println(h);
h.add(1);
System.out.println(h); //1,2가 출력되는데, 집합에서 입력순서는 안중요함.
h.add(1);
System.out.println(h); // 집합은 중복된 값은 추가 안함.
h.remove(1);
System.out.println(h);
System.out.println(h.size());
}
}
[2]
[1, 2]
[1, 2]
[2]
1
자바 TreeSet
-이진 검색 트리(이진탐색트리와 연결리스트를 결합한 자료구조)라는 자료구조 형태로 데이터를 저장하는 자료형 클래스이다.
-정렬된 위치에 저장해 입력순서를 지키지 않는다.
import java.util.TreeSet;
public class Main {
public static void main (String[] args){
TreeSet set = new TreeSet(); //set 이란 변수에 TreeSet 클래스 생성
set.add(89);
set.add(32);
set.add(71);
System.out.println("50 미만의 값 : " + set.headSet(50)); // () 안 값보다 작은 값 반환
System.out.println("50 이상의 값 : " + set.tailSet(50)); // () 안 값보다 큰 값 반환
System.out.print(set); // 입력순서와 관계없이 오름차순 정렬로 저장된 걸 확인 함.
}
}
50 미만의 값 : [32]
50 이상의 값 : [71, 89]
[32, 71, 89]
자바 HashMap
키와 값으로 객체롤 저장하는 구조로 되어 있는 자료구조 클래스
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args){
Map h = new HashMap(); // h 변수에 HashMap 클래스 생성
h.put(1,"A");// add 매소드 대신 put 이 있음.
System.out.println(h);
h.put(1, "C"); // 이미 입력된 A가 C로 변경됨.
System.out.println(h);
h.put(2, "D");
System.out.println(h);
h.remove(1);
System.out.println(h);
System.out.println(h.get(2));// 키 2에 저장된 값 반환 (인덱스가 아님)
System.out.println(h.size());
}
}
{1=A}
{1=C}
{1=C, 2=D}
{2=D}
D
1
자바 TreeMap
-TreeMap은 이진 검색 트리 형태로 데이터를 저장하여 저장 시 자동 정렬되는 특성을 가진다.
-TreeMap은 즉시 정렬하는 특성으로 인해 추가, 삭제 작업이 HashMap보다 오래 걸립니다. 정렬, 검색 작업에는 TreeMap을 그 외에는 HashMap을 씀.
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args){
Map t = new TreeMap(); // 변수 t에 TreeMap 클래스 생성
t.put(1, "A");
System.out.println(t);
t.put(1, "C");
System.out.println(t);
t.put(2, "D");
System.out.println(t);
t.remove(1);
System.out.println(t);
System.out.println(t.get(2));
System.out.println(t.size());
}
}
{1=A}
{1=C}
{1=C, 2=D}
{2=D}
D
1
예외 처리(Exception Handling) 개념
try 다음에 수행할 명령문에서 예외가 발생하면 catch에서 예외를 처리
catch는 하나 이상 작성하며, 상황에 맞는 예외처리가 수행됨. catch(예외처리명)
finally 문장은 예외처리가 끝나고 반드시 실행되어야 하는 명령문을 수행
public class Main {
public static void main(String[] args){
try {
int a = 4/0; // 컴퓨터에서어떤 수를 0으로 나누는 것은 오류임. 예외발생
}
catch (Exception e) { // 예외를 catch 하여 Exception 전달함.
System.out.println(e.getMessage()); // 발생된 예외에 대해 getMessage 출력함.
}
finally {
System.out.println("finally"); // finally 문자열 출력함.
}
}
}
/ by zero
finally
throw
throw는 의도적으로 예외를 던지는 예약어다.
컴파일에는 문제 없으나 런타임에 발생된 에러를 처리하기 위해 사용함.
public class Main{
public static void main (String[] args) {
try{
throw new Exception(); //강제로 예외를 발생시켜 던짐(throw)
}
catch (Exception e) { //발생된 예외를 catch 하여 Exception 전달
System.out.println("강제 예외 발생"); // 화면에 "강제 예외 발생" 출력
}
}
}
강제 예외 발생
throws
throws는 메서드에서 발생하는 예외를 던지는 예약어로 throws 뒤에 발생할 예외를 명시함.
접근제어자 자료형 메서드명(매개변수) throws 예외처리명{
명령문(발생할 예외)
}
public class Main {
public void divide(int a, int b) throws Exception{
System.out.println(a/b); // 4/0은 수학적 에러이므로 예외가 발생함.
}
public static void main (String[] args) {
Main a = new Main(); //Exception 클래스 객체 a 생성
try {
a.divide(4, 0); // 매개변수 a,b에 4, 0 할당
}
catch (Exception e) { // 예외를 캐치하여 Exception 발생함.
System.out.println(e.getMessage()); // 발생된 예외를 getMessage 매서드로 에러 메시지 출력함.
}
}
}
/ by zero
'KNOU_CS > JAVA' 카테고리의 다른 글
상속과 생성자/super( ) (0) | 2024.04.16 |
---|---|
this( ) (0) | 2024.04.16 |
생성자, 소멸자/ 오버로딩(Overloading) / 오버라이딩(Overriding) (1) | 2024.03.22 |
메서드 / 클래스 (0) | 2024.03.21 |
배열/ 입출력/ 연산자 /반복문 (0) | 2024.03.21 |