- 1012(19일차) 수정중..2023년 10월 12일 17시 24분 21초에 업로드 된 글입니다.작성자: 삶은고구마
1011 실습문제 메모관리
scanner 사용해도 ok
내가 사용한 것, 스캐너 이전의 입력방식
BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
그리고 일기 내용 작성시 BufferedWriter사용
파일생성시 File 사용
BufferedWriter 객체 bw
bw.flush(); <출력 스트림 내부버퍼 즉시 대상 출력
남은 버퍼를 한번에 내보내는 기능을 담당하는데 요즘엔 딱히 사용하지 않는다고한다..
왜냐하면
bw.close(); 할때 flush + close를 하기 때문에 flush를 단독으로 쓰기엔..상황을 봐서 써야할듯?
try절 밖에서 변수 선언하고, null 하는 이유 : catch절에서 close 해야해서.
+
BufferedReader, BufferedWriter 사용법 더 익히기.
출력 스트림내 버퍼(flush는 남은 버퍼를 강제로 내보내는 역할) cmd . 현재 경로
.. 상위 경로(부모 디렉토리)
내부 클래스(Inner Class)
클래스 안에 클래스를 선언.
(그 동안은 클래스를 각각 따로 생성하여 사용함)
외부클래스 안에서만 내부 클래스를 사용하는 경우(노출x)
예)Map.Entry
외부클래스의 pirvate 자원을 사용해야 하는 경우
내부클래스도 변수와 마찬가지로 static / non-static / 지역 클래스로 나뉜다.
static클래스는 non-static의 멤버번수에 접근 불가.
package sh.java.inner.clazz; public class Main { public static void main(String[] args) { //static 내부 클래스 //접근할때만 클래스명.으로 하고 생성은 가능. OuterClass.Inner1 app = new OuterClass.Inner1(); app.a(); //non-static 내부 클래스 OuterClass outer = new OuterClass(); OuterClass.Inner2 app2 = outer.new Inner2(); app2.a(); //지역 내부 클래스 //직접 호출 못함 test 메소드 호출 outer.test(); } } package sh.java.inner.clazz; /** *<pre> * @author user1 * 2023-10-12 * * 내부 클래스란? * -클래스 안에 클래스를 선언. * -외부 클래스 안에서만 내부 클래스를 사용하는 경우(노출x) * ex)Map.Entry * -외부 클래스의 private 자원을 사용해야 하는 경우 * * * 종류(변수랑 유사) * 1. static 내부 클래스 * 2. non-static 내부 클래스 * 3. 지역 내부 클래스 */ public class OuterClass { private static int s = 99; private int n = 100; /** * static 내부 클래스 *<pre> * */ public static class Inner1 { //이것도 클래스라 필드 선언 가능 private int field1 = 1; public void a() { System.out.println(s); //System.out.println(n);//외부클래스의 멤버변수 접근 불가 } } /** * non - static 내부 클래스 *<pre> * */ public class Inner2 { public void a() { System.out.println(s); System.out.println(n); } } public void test() { //지역 내부 클래스 (test 라는 메소드 안에 선언,메소드 안에서만 사용가능) class Inner3 { public void a() { System.out.println(s); System.out.println(n); } } //반드시 선언을 먼저한 뒤 객체화 해야함.. Inner3 app = new Inner3(); app.a(); } }
익명 클래스(Anonymous Class)
=무명 클래스
일회성으로 클래스의 선언과 객체 생성을 동시에 처리하는 문법
부모클래스의 자식클래스를 간단히 선언하고자 할 때 사용한다.
굳이 자식클래스까지 따로 만들어서 사용할 정도가 아닐 경우...
package sh.java.anonymous.clazz; public abstract class Animal { public void say() { System.out.println("안녕하세요, 동물입니다."); } } 1)익명클래스 필드로 선언
2)익명클래스 지역변수로 선언
3)익명클래스 매개인자로 사용
package sh.java.anonymous.clazz; /** * *<pre> * 2023-10-12 * * 익명 클래스(무명 클래스) * -1회성으로 클래스의 선언과 객체 생성을 동시에 처리하는 문법 * -부모클래스의 자식클래스를 간단히 선언하고자 할 때.. * */ public class AnimalMain { private Animal cat = new Animal() { public void say() { System.out.println("안녕하세요 고양이임"); } }; public static void main(String[] args) { AnimalMain main = new AnimalMain(); main.test1(); main.test2(); } /** * 1.필드로 선언 * 2.지역변수로 선언 * 3.매개인자로 사용 * */ //매개인자로 받기 public static void introduce(Animal ani) //애니멀의 자식이면 ok { ani.say(); } private void test2() { // TODO Auto-generated method stub //필드 cat.say(); //지역변수 Animal duck = new Animal() { @Override public void say() { // TODO Auto-generated method stub System.out.println("안녕하세요 오립니다"); } }; duck.say(); //매개인자로 전달(추상클래스로 new할수없는데 동적으로 자식클래스 객체를 만들음) introduce(new Animal() { @Override public void say() { // TODO Auto-generated method stub System.out.println("안녕하세요 뱀입니다"); } }); } private void test1() { //Animal을 상속한 클래스 선언과 동시에 객체 생성 //주로 추상클래스,인터페이스 자식클래스를 선언할 목적으로 사용 Animal dog = new Animal() //추상인데 new..?ㅇ { //부모에게 물려받은것을 오버라이드 해서 사용 @Override public void say() { // TODO Auto-generated method stub System.out.println("안녕하세요 갠데요"); } }; dog.say(); } } 인터페이스도 사용 가능하다.+람다
더보기ProductMain
package sh.java.anonymous.clazz; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class ProductMain { //선언과 동시에 객체 생성 private Product shoes = new Product() { private int price = 100000; private String name = "짚신"; @Override public int getPrice() { // TODO Auto-generated method stub return this.price; } @Override public String getName() { // TODO Auto-generated method stub return this.name; } }; public static void main(String[] args) { ProductMain main = new ProductMain(); //main.test1(); main.test2(); //main.test3(); } /** * 람다 표현식 * -자바에서 함수형 프로그램을 지원하기 위한 문법 * -추상메소드가 "하나"뿐인 인터페이스를 함수형태로 객체화 할 수 있다. */ private void test3() { // Operator adder = new Operator() { // // @Override // public int calc(int a, int b) { // return a+b; // } // }; //매개변수랑 리턴값만 //아래의 형태가 기본 // Operator adder = (int a, int b)-> // { // return a+b; // }; //매개변수 타입 생략 가능,메소드 바디에 리턴절이 한 줄 만 있는 경우 {return ;} 생략 가능 //Operator adder = (a,b)->{return a+b;}; //또 줄이기 람다:jdk8~ Operator adder = (a,b)->a+b; //곱셈 매개변수 이름 바꿔도 상관없음 Operator multi = (c,d)->c*d; System.out.println(multi.calc(10, 20)); } /** * 기본정렬 : Comparable * 기타정렬 : Comparator */ private void test2() { List<Coffee> cList = new ArrayList<>(); cList.add(new Coffee("콜드브루라떼",4000)); cList.add(new Coffee("아몬드라떼",4500)); cList.add(new Coffee("감귤주스",7000)); cList.add(new Coffee("모카프라푸치노",6000)); //상품명 오름차순 // cList.sort(new Comparator<Coffee>() { // // @Override // public int compare(Coffee o1, Coffee o2) { // return o1.getName().compareTo(o2.getName()); // } // }); //람다로 ! // Comparator<Coffee> com = // (coffee1,coffee2)-> coffee1.getName().compareTo(coffee2.getName()); // cList.sort(com); //여기서 더 줄이기..매개변수 리턴값만 있으면됨 //cList.sort((coffee1,coffee2)-> coffee1.getName().compareTo(coffee2.getName())); //comparator 구현체 대입 혹은 직접 생성(간단ver,클래스 없이 일회성) cList.sort(new Comparator<Coffee>() { @Override public int compare(Coffee o1, Coffee o2) { // TODO Auto-generated method stub return o1.getPrice()-o2.getPrice(); //가격오름차순 } }); //오름차순 확인용 출력 for(Coffee c:cList) { System.out.println(c); } } /** * 인터페이스도 동일 * 1.필드 * 2.지역변수 * 3.매개인자 */ private void test1() { System.out.printf("이 상품의 이름은 %s, 가격은 %d원 입니다.\n", shoes.getName(),shoes.getPrice()); //메소드 test1의 지역변수로도 역시 선언-생성 가능하다. Product keyboard = new Product() { private int price = 30000; private String name = "삼성 키보드"; @Override public int getPrice() { // TODO Auto-generated method stub return this.price; } @Override public String getName() { // TODO Auto-generated method stub return this.name; } }; System.out.printf("이 상품의 이름은 %s, 가격은 %d원 입니다.\n", keyboard.getName(),keyboard.getPrice()); //매개인자 printProductInfo(new Product() { @Override public int getPrice() { // TODO Auto-generated method stub return 500000; } @Override public String getName() { // TODO Auto-generated method stub return "고급커피"; } }); } public static void printProductInfo(Product p) { System.out.printf("이 상품의 이름은 %s, 가격은 %d원 입니다.\n", p.getName(),p.getPrice()); } } Product 인터페이스
package sh.java.anonymous.clazz; public interface Product { String getName(); int getPrice(); } Operator 인터페이스
package sh.java.anonymous.clazz; public interface Operator { //뭔가를 계산할 메소드 int calc(int a, int b); } Coffee 클래스
package sh.java.anonymous.clazz; public class Coffee implements Product { private String name; private int price; public Coffee(String name, int price) { this.name = name; this.price = price; } @Override public String getName() { return name; } @Override public int getPrice() { return price; } @Override public String toString() { return "Coffee [name=" + name + ", price=" + price + "]"; } }
Thread
프로세스(process) :실행중인 프로그램
스레드(Thread):프로세스 하위 개념. 프로그램없이 스레드도 없음.
모든 프로세스는 하나 이상의 스레드를 가짐.
프로세스 간에는 메모리 영역이 구분되어있음.
프로세스 내의 스레드들끼리는 공유가 가능함.
-스레드 특징
보기에는 스레드 두개가 동시에 진행되는 것 같지만, 아주 빠른 속도로 번갈아 처리함.
스레드 작업 순서는 사용자가 컨트롤 할 수 없음
전적으로 OS의 스케쥴링에 따르게 된다.
우선순위 지정은 가능하지만 절대적인 건 아님.
스레드는 각각의 callStack을 가진다.... heap은 공유
-스레드 선언 및 생성
1)Thread 상속
2)Runnable 인터페이스
둘 다 run()을 override 해서 사용한다.
setName(str); 스레드에 이름을 붙여준다. setPriority(int); 우선순위 부여 (하지만 효과는 미미하다..)
Thread.MAX_PRIORITY 10
Thread.NORM_PRIORITY 5
Thread.MIN_PRIORITY 1start(); 스레드 시작. (run아님) Thread.currentThread().getName() 해당스레드의 이름. sleep(long millis) 스레드 일시정지 1000=1초 interrupt() 특정 스레드를 우회적으로 중지(혹 다음액션) 처리 join() 특정 스레드를 기다리게 함
끝날때까지 기다리기/ 지정한 시간만큼만 기다리기wait() 획득한 lock을 반환하고,
스레드 자신을 임계영역의 waiting pool에 추가함notify() | notifyAll() waiting pool에 대기중인 스레드 하나(전부)를 깨운다. -스레드 컨트롤
스레드가 2개 이상인 경우 생명주기를 고려하여 컨트롤 해야한다.
공유자원이 있는 경우 서로 접근하려고 하기 때문에
한 스레드가 접근한 경우
다른 스레드의 접근을 잠시 막아야 한다.
즉, 번갈아 가면서 한 녀석만 접근하게 해야함.
stop() 대신 interrupt를 사용해야 하는 이유
https://sas-study.tistory.com/373
[Java Thread] 쓰레드 종료, 안전하게 종료하는 방법
기존에는 stop() 메소드를 활용해서 현재 진행중인 스레드를 종료시켰었나봅니다. 하지만 해당 메소드가 Deprecated 되어 있습니다. 왜 그럴까 생각해보았을땐 대충 공유객체에 대한 자원관리와 갑
sas-study.tistory.com
결론:
스레드를 stop으로 중지할 경우 점유하고있던 공유객체가 그대로 남게 됨.
스레드로 어떠한 처리를 하고있다가 미완성된 상태로 남아버리기 때문에...
미완성객체가 다른 스레드나 클래스와 공유하는 객체인 경우 오류를 발생시킬 가능성이 있다.(그래서 사장됨)
interrupt로 interruptedException을 발생시켜 우회적으로 종료시키기.
'공부' 카테고리의 다른 글
1017(22일차) - 오라클,sql기초 (1) 2023.10.17 1013(20일차) (0) 2023.10.13 1011 (18일차) (4) 2023.10.11 1010 (17일차) 예외처리 (2) 2023.10.10 1006(16일차) (0) 2023.10.06 다음글이 없습니다.이전글이 없습니다.댓글