Java 정리 07
21 Nov 2018
Reading time ~7 minutes
Java 정리 07 - while, variable, method
while
- 시작과 끝을 모를 때 사용
- 최소 0번 수행 최대는 조건까지 수행
- flow chart는 for와 같음(개발자가 선택)
while(조건식) {
// 조건식으론 관계연산자거나 method가 들어옴
// 반복수행할문장들
}
초기값;
while(조건식) {
증감소식; // 초기값, 조건식, 증감소식 존재 시 for와 동일
}
// while 무한loop
while(true) {
}
do while
- 시작과 끝을 모를 때 사용
- 최소 1번 수행 최대 조건까지 수행
do {
// 반복수행문장들;
// 최소 한번은 수행 // 조건식으론 관계연산자거나 method가 들어옴
} while (조건식);
초기값
do {
증감소식;
} while(조건식);
// 다음과 같을 때 for문과 동일
public class TestWhile {
public static void main(String[] args) {
// 단을 입력받아 2~9단 사이라면 구구단을 출력
int input = Integer.parseInt(args[0]); // 단
if (input>1 && input<10) {
System.out.println(input + "단 출력하겠습니다.");
int i = 1; // 초기식
while (i < 10) { // 조건식
System.out.println(input+" * "+i+" = "+(input*i));
i++; // 증감식
}
} else {
System.out.println("단은 2~9 사이 값만 입력가능합니다.");
}
}
public class TestWhile03 {
public static void main(String[] args) {
// 무한 loop
while(true) {
System.out.println("무한 loop");
// break가 없어야 무한 loop
break;
}
int i = 0;
while(true) {
System.out.println("조건을 줘서 무한 loop 탈출");
if(i==5) {
break;
}
i++;
}
}
}
Variable (변수)
- 프로그램에 필요한 값을 일시적으로 저장하고 사용하기 위해 만듦
- 자바엔 instance 변수, static 변수, local 변수 이렇게 3가지 변수 존재
- instance 변수 = member 변수
- static 변수 = class 변수
instance 변수 (member 변수)
- 클래스 field에 선언하는 변수
- 객체가 생성되어야 사용할 수 있는 변수
- 생성된 객체에 포함되는 변수
- 자동초기화가 된다
- 객체명.변수명 형태로 사용
- 접근지정자를 사용하여 접근범위를 설정가능
- static 영역에서는 instance 변수를 사용할 수 없다
- instance변수는 객체가 소멸될 때 메모리에서 사라진다
// class field에 instance 변수 선언
접근지정자 데이터형 변수명;
// 접근지정자
// 폴더 개념 접근지정자 (하나만 사용가능)
public // 클래스 외부에서 접근가능
protected // 같은 패키지 다른 클래스에서 접근가능
// - 패키지가 다르면 상속관계의 자식클래스에서만 접근가능
default // 접근지정자를 기술하지 않으면 default(기본 접근 지정자)
// - 같은 패키지 다른 클래스에서 접근 가능
// - 다른 패키지의 클래스에서는 접근 불가
private // 클래스 안에서만 접근가능
// 메모리 개념 접근지정자 (여러개 사용가능)
static // 공용 메모리에 생성
final // 값 변경 불가
transient // 직렬화 방지키워드
// 데이터형
기본형 데이터형 // byte, short, int, long, float,
// double, char, boolean
참조형 데이터형 // String, class, array
// 자동 초기화값
// - 기본형) 정수형 : 0, char : \u0000, 실수형 : 0.0, boolean : false
// - 참조형 : null (객체가 heap의 주소를 할당받지 못했음)
// 변수명은 carmelCase로 표기
접근지정자 예시
package date181121;
/**
* Instance Variable의 접근지정자(Access Modifier) 사용
* - public : 클래스 외부에서 접근 가능
* - protected : 같은 패키지에서 접근 가능
* 패키지 다르면 상속관계의 자식 클래스만 접근 가능
* - private : 클래스 안에서만 접근 가능
* - default : 같은 패키지에서 접근 가능
* 패키지가 다르면 접근 불가
* @author owner
*/
public class InstAccessModifier {
public int pub_i;
protected int pro_i;
private int pri_i;
int def_i;
public static void main(String[] args) {
// 객체화
InstAccessModifier ivam = new InstAccessModifier();
// 변수를 가지고 있는 클래스 안에서 객체화가 되면 접근지정자에
// 상관없이 모두 사용가능.
System.out.println("public : " + ivam.pub_i);
System.out.println("protected : " + ivam.pro_i);
System.out.println("private : " + ivam.pri_i);
System.out.println("default : " + ivam.def_i);
}
}
package date181121; // 같은 패키지 다른 클래스
/**
* 같은 패키지에 존재하는 다른 클래스의 인스턴스변수 접근 사용
* 접근지정자가 public protected, default인 것만 사용가능
* @author owner
*/
public class UseInstAccessModifier {
public static void main(String[] args) {
InstAccessModifier ivam = new InstAccessModifier();
System.out.println("public : "+ ivam.pub_i);
System.out.println("protected : "+ ivam.pro_i);
System.out.println("default : "+ ivam.def_i);
// System.out.println("private : " + ivam.pri_i); 사용불가
}
}
package date181121.sub; // 다른 패키지 다른 클래스
import date181121.InstAccessModifier;
/**
* 다른 패키지에 존재하는 클래스의 인스턴스변수 접근 사용
* 접근지정자 public만 사용가능
* @author owner
*/
public class UseInstAccessModifier {
public static void main(String[] args) {
InstAccessModifier ivam = new InstAccessModifier();
System.out.println("public : "+ ivam.pub_i);
// System.out.println("protected : "+ ivam.pro_i); 사용불가
// System.out.println("default : "+ ivam.def_i); 사용불가
// System.out.println("private : " + ivam.pri_i); 사용불가
}
}
package date181121.sub;
import date181121.InstAccessModifier;
/**
* 상속관계에 있다면 자식클래스로 생성하여 부모클래스 접근가능
* 접근지정자 public, protected만 사용가능
* @author owner
*/
public class UseInstAccessModifier2 extends InstAccessModifier {
public static void main(String[] args) {
UseInstAccessModifier2 ivam = new UseInstAccessModifier2();
System.out.println("public : "+ ivam.pub_i);
System.out.println("protected : "+ ivam.pro_i);
// System.out.println("default : "+ ivam.def_i); 사용불가
// System.out.println("private : " + ivam.pri_i); 사용불가
}
}
객체화(Instantiation, 인스턴스화)
- 클래스를 사용하기 위해 메모리에 올려놓는 것
- static 영역에서 instance 영역의 자원(변수, method)을 사용하기 위해 작성하는 코드
클래스명 객체명 = new 생성자명();
// 클래스의 instance 변수가 memory(heap)에 할당되고 그 주소를 반환
JVM memory 구조
-
method 영역 : 로딩되는 클래스의 정보가 저장, static변수 저장
- static 영역 로딩
-
stack 영역 : 매개변수, local변수 저장
- LIFO(Last In First Out)
-
instance 영역 : new로 생성되는 객체가 저장, instance변수 저장
- = heap
public class UseInstanceVariable {
int i; // 정수형 초기화값 0
int j;
double d; // 실수형 초기화값 0.0
char c; // 문자형 초기화값 \u0000
boolean b; // 불형 초기화값 false
String str; // 참조형 초기화값 null
UseInstanceVariable someClass;
public static void main(String[] args) {
// static 영역은 가장 먼저 메모리(method 영역)에 로드됨
// 생성될지도 모르는 instance 변수를 직접 사용할 수 없다.
// 객체화를 하면 객체가 메모리(heap)에 생성되고,
// 그 주소를 메모리(stack)에 저장
UseInstanceVariable uiv1 = new UseInstanceVariable();
UseInstanceVariable uiv2 = new UseInstanceVariable();
System.out.println("객체출력(heap주소):"+uiv1);
System.out.println("객체출력(heap주소):"+uiv2);
// heap에 생성된 instance variable을 사용
uiv1.i=11;
uiv1.j=21;
System.out.println("uiv1객체의 멤버변수 i="+uiv1.i);
System.out.println("uiv1객체의 인스턴스변수 j="+uiv1.j);
// instance(member)변수는 자동초기화됨
System.out.println("============ 자동 초기화값 ===========");
System.out.println("정수형 :"+uiv2.i);
System.out.println("실수형 :"+uiv2.d);
System.out.println("문자형 :"+uiv2.c); // white space 출력
System.out.println("불형 :"+uiv2.b);
System.out.println("참조형-String :"+uiv2.str);
System.out.println("참조형-class :"+uiv2.someClass);
}
}
static 변수 (class 변수)
-
공용변수
- JVM에서 실행되는 모든 객체가 하나의 변수를 사용
- 클래스의 모든 영역에서 사용됨
- 클래스가 실행되면 가장 처음 메모리(method 영역)에 등록
- 객체화 없이 바로 사용할 수 있다
- 메모리를 절약할 수 있음
- 사용하지 않으면 불필요하게 메모리 낭비
- 실행중인 JVM이 종료되어야 메모리에서 사라짐
- 참조하는 속도가 instance변수보다 빠름
- 자동초기화
- instance변수처럼 class field에 선언
- 클래스명.변수명 으로 사용
// class field에 static 변수 선언
접근지정자 static 데이터형 변수명;
public class UseStaticVariable {
static int i; // static 변수 -> 바로 사용
int j; // instance 변수 -> 객체화 후 사용
public void test() {
i = 100;
j = 200;
System.out.println(i+" / "+j);
}
public static void main(String[] args) {
// class 변수의 사용. 클래스명.변수명
UseStaticVariable.i = 2000;
System.out.println(UseStaticVariable.i);
UseStaticVariable usv = new UseStaticVariable();
UseStaticVariable usv1 = new UseStaticVariable();
usv.j = 5000; // instance 변수는 생성된 객체가 각각 사용
usv1.j = 10000;
// usv.i = 300;
// 객체명으로 사용하면 특정 객체에 속한 member변수가 아니므로
// 사용은 가능하지만 권장하는 문법이 아니다.
UseStaticVariable.i = 300;
System.out.println("usv객체 인스턴스변수 : "+usv.j
+", 스태틱변수 :"+UseStaticVariable.i);
System.out.println("usv1객체 인스턴스변수 : "+usv1.j
+", 스태틱변수 :"+UseStaticVariable.i);
}
}
method
- 클래스 안에 있는 함수 = 메소드
- 자주 사용될 코드를 미리 구현해놓고 필요한 곳에서 호출하여 사용
- 중복코드의 최소화
- 업무를 구분하여 작성할 수 있다
-
instance method와 static method를 지원
-
instance method
- 객체화 하여 사용하는 method
- class의 instance 변수를 사용하여 일처리를 해야하는 경우
-
static method
- 객체화 없이 바로 쓸 수 있는 method
- class의 instance 변수를 사용하지 않고 매개변수로 입력된 값으로만 일처리를 해야하는 경우
-
instance method
-
다형성(polymorphism) 지원
- Overload
- Override
접근지정자 반환형 메소드명(매개변수타입 매개변수명, ... ) {
// 반환형은 method가 처리한 결과를 내보내는 타입
// 매개변수를 사용하여 업무를 처리 후 return을 사용하여 반환
// 반환값은 반환형과 일치하는 데이터형으로 만들어져야 함
return 반환값; // 반환값은 1개만 내보낼 수 있음
}
// 접근지정자
// 폴더 개념 접근지정자 (하나만 사용가능)
// public - 다른 클래스에서 호출 가능
// protected - 같은 패키지의 다른 클래스에서 호출가능
// 다른 패키지에서는 상속관계의 자식 클래스에서만 호출가능
// private - 클래스 안에서만 호출 가능
// default - 같은 패키지의 다른 클래스에서 호출가능, 다른 패키지에선 불가
// 메모리 개념 접근지정자 (여러개 사용가능)
// static - 객체화 없이 메소드를 호출할 때 사용
// final - 오버라이딩 막을 때 사용
// synchronized - 멀티쓰레드에서 동시접근을 막을 때 사용
// 반환형 종류
void // 반환값 없음
기본자료형 // byte, short, int, long, char, float, double, boolean
참조자료형 // class, array, String
// 매개변수 : method 외부의 값을 method 내부로 전달하기 위해 선언하는 변수
public class UseMethod {
// instance method
public void instanceMethod() {
System.out.println("객체화하여 사용하는 "
+ "instance method");
}
// static method
public static void staticMethod() {
System.out.println("객체화 없이 직접 호출하여 "
+ "사용하는 static method");
}
public static void main(String[] args) {
UseMethod.staticMethod(); // static method 호출
UseMethod um = new UseMethod(); // 객체 생성
um.instanceMethod(); // instance method 호출
}
}