java의 속성

4841 단어 독학독학

if / for문

  • 블럭{}안에서 선언한 변수는 블럭이 닫히면 사라짐.
  • 예외로 배열의 경우, 참조하는 다른 이차원 배열이 있을 시
    블럭 닫히고 변수는 사라지지만 값은 여전히 이차원배열에 남아있음
int test = 1	// if 테스트용 변수
int[][] a = new int[3][];
if (test == 1){
	int[] a1 = new int [3];
    a1[0] = 10;
    a1[1] = 20;
    a1[2] = 30;
    a[0] = a1
}				//괄호 닫혔으므로 변수 a1 사라짐.
System.out.print(a[0]+","+a[1]+","+a[2]);	// 10, 20, 30 출력 됨.

Enhanced for 향상된 for문

  • 배열에 값이 담겨져 있지 않아도 배열의 끝까지 출력함
  • 이 경우, 비어있는 부분(null)은 오류 발생

분기문

break

  • 가장 가까이에 있는 반복문 탈출

return

  • 메서드 탈출(함수 탈출)

continue

  • 반복문 내 작업문 탈출
  • 이후 다음 작업문 수행

for문의 증가식, 감소식

  • 증가식
for(int i = 0; i < 5; i++){수행문} 
  • 감소식
for(int i = 0; i > 5; i--){수행문}
  • 조건식의 부등호 방향에 주의
  • 만약 증가식이 객체이며, 객체 범위를 벗어날 경우 null exception이 뜨므로 주의

변수의 초기화

  • 변수를 연산이나 출력에 사용하기 위해서는 반드시 초기화를 해야 함
  • 객체나 배열에 만들어지는 변수는 default 값으로 자동 초기화 됨

메모리 구조

	- 참조형 변수
1. 참조형 변수 생성
String a = "홍길동";

2. Stack에 a 생성

3. a는 "홍길동"의 주소값을 갖고 있음.

	
    - 기본형 변수
1. 기본형 변수 생성
int b = 3;

2. stack에 b 생성

3. b는 3을 갖고 있음


	- 객체
1. 객체 생성
Car c = new Car();
c.number = 3214;

2. stack 에 c가 생성됨

3. c는 c.number의 주소값을 갖고 있음
  • 클래스영역 : Static
  • 변수영역 : Stack
  • 객체영역 : Heap

String 클래스

  • 같은 값이여도 다른 인스턴스에 저장되어 있으면 다른값으로 인식함(동일성)
        String str1 = new String("Hello world");
        String str2 = new String("Hello world");
        
        if(str1 == str2){
            System.out.println("str1과 str2는 같은 인스턴스를 참조합니다.");
        }
        else{
            System.out.println("str1과 str2는 다른 인스턴스를 참조합니다.");
        }
        // str1과 str2는 다른 인스턴스를 참조합니다. 출력
        // 값은 Hello world로 같지만, 인스턴스가 다르기 때문
  • 값 자체만 두고 비교하면 같은 값이라고 판단함(동등성)
 String str1 = new String("Hello world");
        String str2 = new String("Hello world");
        
        if( str1.equals(str2) ){
            System.out.println("str1과 str2는 같은 값을 가지고 있습니다.");
        }
        else{
            System.out.println("str1과 str2는 다른 값을 가지고 있습니다.");
        }
        // str1과 str2는 같은 값을 가지고 있습니다. 출력
        // 변수1.equals(변수2) 값을 비교하여 true, false로 출력함

call by Value

Class Sample{
	public static void value(int x, int y){
    	x = x+10;
    	y = y+10;
    }
    
    public static void main(String[]args){
    	int a = 2;
        int b = 1;
    	
        System.out.println(a+","+b);	// ★출력값 2,1
        value(a,b);		// a = a+10, b = b+10 
        System.out.println(a+","+b);	// ☆ 출력값 2,1
        System.out.println(a+10);	// ◇ 출력값 12
	    System.out.println(a+20);	// ◆ 출력값 22
    }
  • 기본자료형은 호출 시 값만 복사하여 보냄
    int a = 10인 경우 값인 10만 복사
  • ★부분 출력값(a,b)와 value(a,b)로 (int x, int y)에 들어간 a,b는 이름만 같고 값을 공유하지 않음
  • a나 b를 끌고 왔을때 가져온 건 원본이 아닌 복사본임. 따라서 ★부분 계산식이 적용되지 않은 것
  • ◇◆도 마찬가지
  • 1회성이라고 생각해두자

call by Reference

package practice;

public class Sample {	
	
    int value;

	Sample(int value) {
	this.value = value;
	}

	public static void swap(Sample x, Sample y) {
		x.value = 10;
		y.value = 20;
	}


	public static void main(String[] args) {
	Sample a = new Sample(20);
	Sample b = new Sample(10);

	System.out.println(a.value + "," + b.value);	// a = 20, b = 10
	swap(a, b);		// x = 10, y = 20;
	System.out.println(a.value + "," + b.value);	// a = 10, b = 20

	}
}
  • 참조자료형은 호출 시 원본의 주소값을 보냄. 따라서 값이 변경되면 객체에 계속 남아있음
  • 실시간으로 모든 값이 바뀐다는 뜻은 아님

interface 호출

  • 인터페이스가 인터페이스를 호출 할 수 있다
public interface a{}
public interface b{
	public a a1();
}    
  • 이 속성을 응용하여 Iterator가 Collection에 정의되어있음
public interface Iterator{
boolean hasNext();
Object next();
void remove();
}

public interface Collection{
	...
	public Iterator iterator();
    ...
}    

예외처리

  • 메인 외 다른곳에서 디버깅 정보만 출력하는 예외처리는 최악의 코드
  • 사용자 정의 예외를 발생시키거나 throw로 Exception을 잡아야함
1. 안좋은 예
		try {
        	...
		} catch (ClassNotFountException ex) {
			ex.printStackTrace();
		}
2. 괜찮은 예
		try {
        	...
		} catch (ClassNotFountException ex) {
			ex.printStackTrace();
			throw new RuntimeException(ex);
		}

좋은 웹페이지 즐겨찾기