java의 속성
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);
}
Author And Source
이 문제에 관하여(java의 속성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoonee1126/java의-속성저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)