• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

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로 표기

접근지정자 예시

03

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

01

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);
    }
}

02


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 호출
     }
}

숙제풀이1

숙제풀이2



Java