초기값;while(조건식) { 증감소식; // 초기값, 조건식, 증감소식 존재 시 for와 동일}
// while 무한loopwhile(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); 사용불가 }}
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 변수를 사용하지 않고 매개변수로 입력된 값으로만 일처리를 해야하는 경우
다형성(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 호출 }}