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){ //예외 처리를 위한 문장 }
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
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
복사