[앱 스쿨 2기 : Android] 2주차 2023.05.04 (Java)

hxeyexn·2023년 5월 5일
1
post-thumbnail

📅 2023.05.04

📂Java41_Thread ~ 📂Java52_CollectionEx

Thread

자바에서 비동기 처리를 지원하기 위해 제공하는 클래스

  • 오류가 발생할 가능성이 높은 작업의 경우 별도의 쓰레드로 운영하면 안정적으로 운영할 수 있음

동기? 비동기?

  • 동기 : 작업을 순차적으로 처리하는 것
  • 비동기 : 동시에 여러 작업을 처리하는 것
  • 동기적인 작업 다수를 비동기적으로 처리하게 됨

Java에서 Thread 사용 목적

  • 비동기 처리
  • 오류가 발생할 가능성이 있는 코드에 대한 처리

Thread 작성 법

  • Thread 클래스 상속 받는 방법
public class MainClass {

	public static void main(String[] args) {
    	// Thread 클래스를 상속받은 Thread 클래스
    	Thread t1 = new TestClass1();
    	t1.start();
	}
}

// Thread를 상속받은 클래스
class TestClass1 extends Thread {
	// 쓰레드를 발생시켜 처리할 메서드
	public void run() {
    	try {
        	for (int i = 0; i < 100; i++) {
            	Thread.sleep(500);
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
 	}
}       
  • Runnable 인터페이스를 구현하는 방법
public class MainClass {

	public static void main(String[] args) {
    	// Runnable 인터페이스를 구현한 클래스
		TestClass2 t2 = new TestClass2();
        Thread thread = new Thread(t2);
        t2.start();
    }
}

// runnable 인터페이스를 구현한 클래스
class TestClass2 implements Runnable {
	// 쓰레드를 발생시켜 처리할 메서드
	public void run() {
    	try {
        	for (int i = 0; i < 100; i++) {
            	Thread.sleep(300);
            	System.out.println("TestClass2");
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
}

📂Java41_Thread


Thread Priority (쓰레드 우선순위)

여러 쓰레드를 가동 시켰을 때 우선적으로 처리할 쓰레드를 지정할 수 있음

쓰레드 우선순위

  • 여러 쓰레드 중 처리가 시급한 쓰레드라면 우선순위 높이면 됨
  • 우선 순위 값 : 1 ~ 10 (기본 값 : 5)
  • 우선 순위 값이 클수록 먼저 처리할 확률 높음
  • 우선 순위가 높다고 해서 반드시 가장 먼저 처리되는 것은 아님!!
public class MainClass {

	public static void main(String[] args) {
		Thread1 t1 = new Thread1();
        Thread2 t2 = new Thread2();
        Thread3 t3 = new Thread3();
        
        // 쓰레드 우선 순위 설정
        t1.setPriority(10);
        t2.setPriority(3);
        t3.setPriority(1);
        
        // 쓰레드 가동
        t1.start();
        t2.start();
        t3.start();
	}
}

class Thread1 extends Thread {
	@Override
	public void run() {
    	for (int i = 0; i < 100; i++) {
			System.out.println("Thread1");
        } 
    }
}

class Thread2 extends Thread {
	@Override
	public void run() {
        for (int i = 0; i < 100; i++) {
			System.out.println("Thread2");
        } 
    }
}

class Thread3 extends Thread {
	@Override
	public void run() {
    	for (int i = 0; i < 100; i++) {
        	System.out.println("Thread3");
        }
    }
}

📂Java42_ThreadPriorty


Thread Synchronize (쓰레드 동기화)

쓰레드는 비동기 처리

  • 다수의 쓰레드가 같은 메서드를 호출했을 경우 메서드의 코드가 비동기적으로 처리됨
  • 쓰레드를 동기화시키고 싶다면 메소드를 동기화
  • 쓰레드가 동기로 바뀌는 게 아니라 쓰레드는 비동기로 돌아가다가 동기화된 메소드를 호출해서 동기적으로 처리
  • synchronized 키워드를 사용해 동기화 처리

임계영역

  • 여러 개의 쓰레드가 동시에 접근할 수 있는 코드 영역 혹은 메서드
  • 프로그램에서 임계 영역이 있을 경우 프로그램 전체의 심각한 오류 발생시킬 수 있음
  • 동기화를 통해 해결 가능

동기화처리 X (비동기)

  • 쓰레드 수행 동시에 일어남

동기화처리 O

  • 쓰레드가 호출한 순서대로 수행

동기화? 우선순위?

  • 동기화 ≠ 우선순위
  • 차례대로 처리하고 싶다 ➡️ 동기화
  • 여러 쓰레드 중 처리가 시급한 쓰레드가 있다 ➡️ 우선순위
public class MainClass {
	Thread1 t1 = new Thread1();
    Thread2 t2 = new Thread2();
    Thread3 t3 = new Thread3();
    
    t1.start();
    t2.start();
    t3.start();
}
class Thread1 extends Thread {
	@Override
    public void run() {
    	TestClass.testMethod("Thread1");
    }
}

class Thread2 extends Thread {
	@Override
    public void run() {
    	TestClass.testMethod("Thread2");
    }
}

class Thread3 extends Thread {
	@Override
    public void run() {
    	TestClass.testMethod("Thread2");
    }
}

class Testclass {
	public synchronized static void testMethod(String name) {
    	// 임계영역 코드
    	for (int i = 0; i < 100; i++) {
        	System.out.printf("%s : %d\n", name, i);
        }
    }
}

📂Java43_ThreadSynchronize


Exception Handling (예외처리)

예측이 가능한 오류가 발생했을 경우 이를 처리할 수 있도록 사전에 코드를 작성하는 것

  • 프로그램 수행 중 오류(예외)가 발생하거나 발생할 가능성이 있다면 JVM은 오류가 JVM이나 OS에 전파되는 것을 막기 위해 프로그램을 강제 종료
  • 이때, 강제 종료를 막고 오류 발생 시 개발자가 준비한 코드가 수행될 수 있도록 하여 오류를 대비
  • 만약 예외처리를 사용하지 않고 if 문으로 다 대비할 수 있으면 if문으로 처리하는 게 좋음
  • try, catch는 오류가 발생한 상태이므로 if로 처리할 수 있는 부분은 오류가 안 나도록 사전에 예방

예외와 오류

프로그래밍에서 오류는 예외, 오류 두가지

  • 예외 : 정리해둔 오류 -> 해결 O
  • 오류 : 해결X

예외처리 목적

  • 오류 발생 시 어플 종료를 막음

try, catch

  • try : 원하는 처리의 코드
  • catch : 오류가 발생했거나 발생할 가능성이 있을 때 동작하는 코드

throws

  • 메서드를 수행할 때 지정한 예외가 발생할 가능성이 있다고 알려줌
  • throws를 사용하면 이 메서드를 호출 하는 쪽은 무조건 예외처리 해야함

📂Java44_Exception


Object

java.lang 패키지

  • 자바 프로그래밍 언어 설계의 기본이 되는 클래스를 제공
  • 자바에서 유일하게 import 하지 않고 사용할 수 있는 패키지
  • 자바 프로그램을 작성할 때 많이 사용하는 것들이 모여 있음
  • lang 패키지에 있는 클래스와 동일한 이름의 클래스는 절대 만들면 X

Object

  • Object 클래스는 클래스 계층 구조의 루트
  • 모든 클래스에는 상위 클래스로 Object가 있음
  • Java에서 클래스를 정의할 때 상속 받는 코드를 작성하지 않으면 extends Object가 추가된다고 생각하면 됨

Java API 문서


📂Java45_Object


Wrapper Class

기본 자료형 값을 관리하기 위한 목적으로 만든 클래스

  • 자료형에 대한 정보 파악
  • 기본 자료형 값을 객체로 포장하는 용도로 사용

Boxing

  • 기본 자료형 값을 Wrraper 클래스 타입으로 만들어 줌

UnBoxing

  • Wrapper 객체에 담긴 값을 추출하여 기본 자료형 값에 담음
public class MainClass {

	public static void main(String[] args) {
    
    	// 기본 자료형 값을 객체로 포장하는 용도로 사용
        Integer a1 = new Integer(100);
        int a2 = a1.intValue();
        System.out.printf("a1 : %d\n", a1);
        System.out.printf("a2 : %d\n", a2);
        
        // Boxing
        Integer a3 = 100;
        // UnBoxing
        int a4 = a3;
        System.out.printf("a3 : %d\n", a3);
        System.out.printf("a4 : %d\n", a4);
        
    }
    
    public static int add(Integer a1, Integer a2) {
    	return a1 + a2;
    }
    
    public static Object[] array = new Object[3];
    
    public static void add(Object obj, int idz) {
    	array[idx] = obj;
    }
}       

❓위 코드를 이클립스에서 보면 아래와 같이 Integer에 취소선이 생김

Why? 중요도가 떨어져 더 이상 사용하지 않고 앞으로 사라지게 될 기능이기 때문
어떤 기능을 아직 사용하고 있지만 새로운 기능이 나왔기 때문에 조만간 사라지게 될 상태


📂Java46_WrapperClass


String

자바에서 문자열을 관리하기 위해 제공되는 클래스

  • " "로 묶어준 문자열도 String 객체
  • String str1 = new String("안녕하세요"); 보다 String str1 = "안녕하세요"; 처럼 사용
  • 객체는 다르지만 가지고 있는 값을 비교하겠다고 하면 무조건 equals 사용

⭐⭐⭐ equals

  • 두 객체가 관리하는 값이 같은지 비교
  • == 와 다름 ➡️ == 는 두 객체가 같은 객체인지 비교
public class MainClass {
	
    public static void main(String[] args) {
    
    	String str1 = new String("안녕");
        String str2 = new String("안녕");
        
        if (str1 == str2) {
			System.out.println("str1과 str2는 같다");
        } else {
        	System.out.println("str1과 str2는 다르다");
        }   
    }
}    
➡️ str1과 str2는 다르다
public class MainClass {
	
    public static void main(String[] args) {
    
    	String str1 = new String("안녕");
        String str2 = new String("안녕");
        
        if (str1.equals()) {
			System.out.println("str1과 str2는 같다");
        } else {
        	System.out.println("str1과 str2는 다르다");
        }   
    }
}    
➡️ str1과 str2는 같다

toUpperCase, toLowerCase

  • toUpperCase : 소문자를 대문자로 하는 문자열 생성
  • toLowerCase : 대문자를 소문자로 하는 문자열 생성
public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = "ABcde";
        String str2 = str1.toUpperCase();
        String str3 = str1.toLowerCase();
    }
}

⭐ startsWith, endsWith

  • startsWith : ~로 시작하는지
  • endsWith : ~로 끝나는지
  • 주소 검색에 많이 사용
public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = "ABcde";
        boolean b1 = str1.startsWith("AB");
        boolean b2 = str1.endsWith("ff");
    }
}

indexOf

  • 지정된 문자열의 위치를 반환
  • 문자열 있는지 없는지 확인을 위해서도 활용 가능
public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = "ABcde";
        int idx1 = str1.indexOf("AB");
        int idx2 = str1.indexOf("ff");
    }
}

length

  • 문자열 길이를 반환
public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = "ABcde";
        int a1 = str1.length();
    }
}

substring

  • 문자열 일부를 가져옴
public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = "ABcde";
        // 순서값 1부터 끝까지 
        String str2 = str1.subString(1);
        // 순서값 1부터 4 - 1까지
        String str2 = str1.subString(1, 4);
    }
}

trim

  • 문자열 좌우 공백을 제거
  • 외부에서 입력된 문자에 대해 trim으로 꼭 좌우 공백 제거
public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = "   aaaa   ";
        System.out.printf("%s\n", str1.trim());
    }
}

📂Java47_String


StringBuffer

문자열을 추가하거나 변경 할 때 주로 사용하는 자료형

  • String이 관리하는 문자열은 변경 불가능
  • 이에, 추가 변환 삭제 등의 작업을 하게 되면 새로운 문자열이 계속 생성
  • 메모리를 효율적으로 사용하기 위해 자주 변화되는 문자열은 StringBuffer로 관리
  • 문자열을 추가하거나 변환 작업을 할 때 문자열이 기하급수적으로 늘어나는 것을 방지

append (추가)

public class MainClass {
	
    public static void main(String[] args) {
    	StringBuffer buffer1 = new StringBuffer();
		buffer1.append(10);
        buffer1.append("문자열");
    }
}
➡️ 10문자열

insert (삽입)

public class MainClass {
	
    public static void main(String[] args) {
    	StringBuffer buffer1 = new StringBuffer("문자열");
		buffer1.insert(1, 10);
        buffer1.insert(3, "문자열");
    }
}
➡️ 문10문자열자열

replace (변경)

public class MainClass {
	
    public static void main(String[] args) {
    	StringBuffer buffer1 = new StringBuffer("문자열문자열");
		// 1 ~ 4 - 1까지를 동해물과 백두산으로 바꿈
        buffer1.replace(1, 4, "동해물과 백두산");
    }
}
➡️ 문동해물과 백두산자열

delete (삭제)

public class MainClass {
	
    public static void main(String[] args) {
    	StringBuffer buffer1 = new StringBuffer("문자열문자열");
		// 1 ~ 4 - 1까지 삭제
        buffer1.delete(1, 4);
    }
}
➡️ 문자열

StringBuffer -> String

public class MainClass {
	
    public static void main(String[] args) {
    	String str1 = buffer1.toString();
    }
}

📂Java49_StringBuffer


Date, Calendar

  • Date : 컴퓨터 입장에서의 시간 관리
  • Calendar : 사람 입장에서의 시간 관리
  • 1970년 01월 01일 0시 0분 0초 0ms → 0

📂Java50_DateCalendar


Collection

데이터의 집합, 그룹

  • 객체관리에 Collection 중 ArrayList, HashMap을 많이 사용

Generic type

  • Collection들은 Generic type이라는 것을 설정할 수 있음
  • Collection이 관리할 객체의 타입을 지정하는 것으로써 객체를 추출할 때 형변환을 자동으로 해줌
  • 자바에서 Collection 사용할 때 Generic type 꼭 쓰기!

List

  • 순서를 통해 관리
  • 데이터 갯수를 알 수 없을 때 사용
  • 리스트보단 배열이 빠르고 메모리 사용이 적음
import java.util.ArrayList;

public class MainClass {

	public static void main(String[] args) {
    	ArrayList<String> list = new ArrayList<String> ();
        list.add("문자열1");
        list.add("문자열2");
        list.add("문자열3");
        
        // 관리하는 객체의 개수
        System.out.printf("객체 개수 : %d\n", list.size());
        
        // 객체를 추출하여 변수에 담는다
        String str1 = list.get(0);
        
        for (String str2 : list) {
        	System.out.println(str2);
        }
        
        // 순서를 지정하여 삭제
        list.remove(1);
        // 객체를 지정하여 삭제
        list.remove("문자열3");    
        
        // 삽입
        list.add(1, "추가된 문자열");
        System.out.println(list);
        
        // 모두 삭제
        list.clear();
    }
}
➡️ 객체 개수 : 3
   문자열1
   문자열2
   문자열3
   [문자열1, 추가된 문자열]

Map

  • 이름을 통해 관리
  • 메서드를 집어넣지 못하기 때문에 클래스처럼 사용하지는 못함
  • 순서가 없어 삽입이라는 기능이 없음
import java.util.HashMap;

public class MainClass {

	public static void main(String[] args) {
    	HashMap<String, String> map = new HashMap<String, String> ();
        map.put("key1", "문자열1");
        map.put("key2", "문자열2");
        map.put("key3", "문자열3");
        
        String str = map.get("key1");
        System.out.println(str);
        
        // 객체 제거
        map.remove("key1");
        System.out.println(map);
        
        // 모두 제거
        map.clear();
    }
}
➡️ 문자열1
   {key2=문자열2, key3=문자열3}

Set

  • 집합(중복된 객체를 담을 수 없고, 순서와 이름에 대한 개념이 없음)
  • 잘 사용하지 않음

📂Java51_Collection


profile
Android Developer

0개의 댓글