//////
Search
📓

09/28 Static, 예외 처리, 과제1~2

생성일
2022/09/28 06:46
태그

Static - 최아영

static 변수

static 변수는 클래스 변수이다.
객체를 생성하지 않고도 static 자원에 접근이 가능하다.
메모리에 한번 할당되어 프로그램이 종료될 때 해제된다.
객체 생성과 관계없이 제일 먼저 호출된다.

클래스 내부 접근

static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능하다.

클래스 외부 접근

private으로 선언되지 않으면 클래스 외부에서도 접근 가능하다.
접근 수준 지시자가 허용하는 범위에서 접근 가능하다.
클래스 또는 인스턴스의 이름을 통해 접근한다.

클래스 변수 접근 예제

class AccessWay { static int num = 0; AccessWay() { incrCnt(); } void incrCnt() { num++; // 클래스 내부에서 이름을 통한 접근 } } class ClassVar { public static void main(String[] args) { AccessWay way = new AccessWay(); way.num++; // 외부에서 인스턴스의 이름을 통한 접근 AccessWay.num++; // 외부에서 클래스의 이름을 통한 접근 System.out.println("num = " + AccessWay.num); } }
Java
복사

static의 활용 예제

class InstCnt { static int instNum = 0; // 클래스 변수 (static 변수) InstCnt() { instNum++; System.out.println("인스턴스 생성: " + instNum); } } class ClassVar { public static void main(String[] args) { InstCnt cnt1 = new InstCnt(); InstCnt cnt2 = new InstCnt(); InstCnt cnt3 = new InstCnt(); } }
Java
복사
class AAA { int num = 0; static void addNum(int n) { num += n; // Static 메소드에는 인스턴스 변수가 올 수 없다. } }
Java
복사

메모리 영역

Method Area
Static 변수와 Static 메소드를 저장한다.
프로그램의 시작부터 종료가 될 때까지 메모리에 남아있게 된다.
Stack
메소드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터의 값이 저장된다.
메소드가 호출될 때 할당되고 종료 되면 해제된다.
Heap
참조형의 데이터 타입을 갖는 객체와 배열 등이 저장된다.
Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값을 new 연사자를 통해서 리턴 받는다.
동적 할당된 메모리 영역 중 필요 없게 된 영역이 JVM에 의해 알아서 해제되는 기능을 가비지컬렉션이라고 한다.

예외 처리(Exception Handling) - 이가현, 임학준

프로그램 오류

컴파일 에러(compile time error)
=컴파일 할때 발생하는 에러(에러발생시-프로그램 실행)
런타임에러(runtime error)
=실행할때 발생하는 에러(에러발생시-프로그램 종료)
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception):프로그램 코드에 의해서 수습할 수 있는 다소 미약한 오류
논리적에러(logical error)
=작성으로와 다르게 동작 (에러발생시-프로그램 작동,값이 다르게나옴)

예외처리하기(Try-catch)

try{ // 예외가 발생할 가능성이 있는 문장 } catch(exception e){ //예외 처리를 위한 문장 }
try블럭내 예외가 발생한경우
public static void main(String[] args) { int num=0; int result; System.out.println(1); System.out.println(2); try { result=num/num; System.out.println(3); //예외 발생시 try문내에 예외발생 부분 뒤에 출력x } catch (Exception e) { System.out.println("예외입니다."); //예외시 출력할 내용 } System.out.println(4); //예외 발생후 catch문 실행,try-catch문 빠져나와서 뒤에 계속 실행
Java
복사
출력값
1 2 예외입니다. 4
try블럭내에서 예외 발생
public static void main(String[] args) { int num=1; int result; System.out.println(1); System.out.println(2); try { result=num/num; System.out.println(3); //예외 발생x 뒤부분에 출력 } catch (Exception e) { System.out.println("예외입니다."); //예외 발생x 출력x } System.out.println(4); //try블럭 진행후 catch(예외)부분 건너뛰고 출력 }
Java
복사
출력값
1 2 3 4

printStackTrace() 와 getMessage()

printStackTrace()
=예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메서지를 화면에 출력
getMessage()
=발생된 예외 클래스의 인스턴스에 저장된 메세지를 출력
try { System.out.println(0/0); } catch(ArithmeticException ae){ //ArithmeticException타입의 ae 객체생성 ae.printStackTrace(); //printstacktrace()메서드 출력 System.out.println(ae.getMessage()); //getMessage 메서드 출력 }catch (Exception e) { System.out.println("예외입니다."); }
Java
복사
그 외

멀티 catch블럭

=내용 같은 catch 블럭을 하나로 합친 것
try { System.out.println(0/0); }catch (ExceptionA e1) { //예외A문 e1.printStackTrace(); }catch (ExceptionB e2) { //예외 B문 e2.printStackTrace(); }catch(ExceptionA|ExceptionB) { e.printStackTrace(); //멀티 catch문 }
Java
복사
주의할점
한쪽에만 사용가능한 메서드 사용하지 않기
부모자식관계 사용안하기

둘 이상의 예외 넘김에 대한 선언

JAVA설계시 최고 조상 클래스를 object로 정했다
예외 클래스는 컨트롤 할 수 없는(Error), 컨트롤 가능한(Exception)으로 나뉜다
Error는 메모리초과 등 JVM을 통해 발생되며 코드 수정으로 해결이 어렵다

Checked Exception

개발자가 반드시 예외처리를 해야한다
throws IO Exception, try catch등 예외처리를 하지않으면 컴파일 에러가 난다
public static void main(String[] args) { Path file = Paths.get("C:\\javastudy\\Simple.txt");//텍스트파일을 객체에 연결 BufferedWriter writer = null; try { writer = Files.newBufferedWriter(file); // IOException 발생 가능 writer.write('A'); // IOException 발생 가능 } catch(IOException e) { e.printStackTrace(); } finally { //finally안에서 close();가 있기때문에 다시 try catch를사용한다 try { if(writer != null) // IOException 발생 가능(.close()) writer.close(); } catch(IOException e) { e.printStackTrace(); } } }
Java
복사
Files.newBufferedWriter, close함수 에서 IOException 발생 가능한 부분은 try catch로 개발자가 예외처리를 해야한다.( 처리안할시 컴파일 에러 발생 )

Unchecked Exception

예외 처리를 강제하지않는다
Unchecked Exception은 명시적으로 예외 처리할 필요가 없으며, 런타임시 예외가 확인된다
RuntimeException을 상속받은 예외 클래스
import java.util.Scanner; public class Ex_UncheckedException { public static void main(String[] args){ Scanner kb = new Scanner(System.in); int n1 = kb.nextInt(); int n2 = kb.nextInt(); int n3 = n1/n2; System.out.println(n3); } }
Java
복사
입력값 n2에 0을 넣게되면 컴파일 에러 ArithmeticException: / by zero 메세지가 나타난다
Unchecked Exception은 컴파일은 가능하나 이후 이용에따라 컴파일 에러가 발생할수있

과제 1(Insertion sort) - 조국현

public class InsertionSort { public static void main(String[] args){ int[] arr={5 ,1, 3, 8, 2, 7, 6}; int temp; // 원소 바꿀 때 임시로 값 저장할 변수 for(int i = 1; i < arr.length; i++){ //두번째 원소부터 비교하므로 i=1 시작 for(int j = i - 1; j >= 0 ; j--){ //비교되는 원소는 i 왼쪽의 원소이다. if(arr[i] < arr[j]) { // i 인덱스 원소가 j 인덱스보다 작으면 temp = arr[i]; // 서로 값을 교환한다. arr[i] = arr[j]; arr[j] = temp; i = j; // 바로 옆 인덱스 원소와 교환되었으므로 인덱스 바꿈. } } } for (int num : arr) { System.out.println(num); } } }
JavaScript
복사

과제 2(다형성 활용 문제) - 김상호

import java.util.Arrays; class PolyExample { public static void main(String args[]) { Buyer b = new Buyer(); b.buy(new Tv()); b.buy(new Computer()); b.buy(new Tv()); b.buy(new Audio()); b.buy(new Computer()); b.buy(new Computer()); b.buy(new Computer()); b.summary(); } } class Buyer { int money = 1000; Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열 int i = 0; // Product배열 cart에 사용될 index void buy(Product p) { /* (1) 아래의 로직에 맞게 코드를 작성하시오 . 1.1 가진 돈과 물건의 가격을 비교해서 가진 돈이 적으면 메서드를 종료한다. ok 1.2 가진 돈이 충분하면, 제품의 가격을 가진 돈에서 빼고 ok 1.3 장바구니에 구입한 물건을 담는다.(add메서드 호출 ) ok */ if(money < p.price) { System.out.println("금액이 부족합니다."); return; } // else 써보기 money -= p.price; add(p); } void add(Product p) { /* * (2) 아래의 로직에 맞게 코드를 작성하시오. 1.1 i의 값이 장바구니의 크기보다 같거나 크면 1.1.1 기존의 장바구니보다 2배 큰 새로운 배열을 생성한다. 1.1.2 기존의 장바구니의 내용을 새로운 배열에 복사한다. 1.1.3 새로운 장바구니와 기존의 장바구니를 바꾼다. 기존에 있던 장바구니를 계속 이용하기 위해. 1.2 물건을 장바구니(cart)에 저장한다. 그리고 i의 값을 1 증가시킨다. */ if(i >= cart.length){ Product[] newCart = new Product[cart.length*2]; //newCart = System.arraycopy(cart, 0, cart.length, 0, Math.min(cart.length, newCart.length)); for (int j = 0; j < cart.length; j++){ newCart[j] = cart[j]; } cart = newCart; } cart[i] = p; i++; } // add(Product p) void summary() { /* * (3) 아래의 로직에 맞게 코드를 작성하시오 . 1.1 장바구니에 담긴 물건들의 목록을 만들어 출력한다 . 1.2 장바구니에 담긴 물건들의 가격을 모두 더해서 출력한다. 1.3 물건을 사고 남은 금액 를 출력한다(money). */ int sum = 0; System.out.print("구입한 물건 목록: "); for(int i = 0; i < cart.length; i++){ System.out.print(cart[i] + ","); sum += cart[i].price; } System.out.println(); System.out.println("사용한 금액: " + sum); System.out.println("남은 금액: " + money); } // summary() } class Product { int price; // 제품의 가격 Product(int price) { this.price = price; } } class Tv extends Product { Tv() { super(100); } public String toString() { return "Tv"; } } class Computer extends Product { Computer() { super(200); } public String toString() { return "Computer"; } } class Audio extends Product { Audio() { super(50); } public String toString() { return "Audio"; } }
Java
복사