[Java] 2020.10.29. day_7 반복문(for-each,while,do~while), instance변수,접근지정자

2020. 10. 29. 10:39Web_Back-end/Java SE

◎ 중첩 for문 쉽게 이해하기

위와 같은 값을 출력해보기

출력방법은 아래와 같다 ▼

for(int i=0; i<=4; i++) {
			//i는 0부터 시작하여 3까지 반복
			//j는i보다 1만큼 큰 값으로 시작하여 4까지 반복
			for(int j=i+1; j<=4; j++) {
				System.out.print(i + " " + j + " ");
			}
			System.out.println("");
		}

※ 코드를 짤 때 먼저 문제를 쉽게 이해해보기

for (초기값; 조건식; 증.감소식)

i j i j i j i j
0 1 0 2 0 3 0 4
1 2 1 3 1 4    
2 3 2 4        
3 4            

표를 보면 i는 0부터 시작하여(초기값) 3까지 반복(조건식) 

j는 i보다 1만큼 큰 값으로 시작하여(초기값) 4까지 반복(조건식)

이렇게 풀어서 생각하면 코드를 짜기 쉽다.

 

◎ 한번 더 해보기

		for(int i=0; i<=3; i++) {
			for(int j=0; j<=i; j++) {
				System.out.print(i + " " + j + " ");
			}
			System.out.println("");
		}

i는 0에서 시작, 3까지 반복

j는 0에서 시작, i와 같은 값까지 반복


무한 loop(infinite loop)

  • 끝나지 않는 프로그램을 만들어야 할 때(OS, 시계, 서버,,,)
  • 초기값, 조건식, 증.감소식을 작성하지 않을 때
    • == 증가하는 값을 알 수 없다 
    • for( ; ; ){
    • }
  • 조건식만 생략하여 작성할 때
    • == 증가하는 값을 알 수 있다
    • for(초기값;  ; 증.감소식){
    • }

break; //switch~case, for, while, do~while을 빠져나갈 때

※ 만약 아래처럼 작성하면 코드는 실행되지 않는다. error

for( ; ; ){

}
코드

☆ 이유 : 무한루프 다음 작성된 코드는 실행되지 않는다 따라서 에러가 발생함


◎ 개선된 for문 _ for each

  • 인덱스를 사용할 수 없고, 
  • 입력된 배열 또는 Collection (List.Set) 의 처음 방부터 끝방까지 출력하는 일
  • 기존의 for보다 처리되는 속도가 느리다
  • Java SE 5 (JDK 1.5) 에서부터 지원하는 문법
    • 문법)
    • for(데이터형 변수명: 배열명){
    •     변수명;  //방의 값을 사용할 수 있다
    • }
    • 배열명에는 List명, Set명 올 수 있다

◎ 시작과 끝을 알 수 없을 때 사용하는 반복문 => while, do~while

while do~while
최소 0번 수행에 최대 조건까지 수행 최소 1번 수행에 최대 조건까지 수행
문법)

초기값;
while ( 조건식 ) {
  반복수행문장;
  증.감소식;
}
==> for문과 같이 사용한 것
      (아직 많이 배우지 않아서 이렇게 쓸 예정)

while(조건식){
  반복수행문장;
}
==> 보통 이렇게 사용
문법)

초기값;
do{   
   반복수행문장들;
   증.감소식;
} while (조건식);

조건식의 결과가 true이면 do로 올라가서 실행
false이면 반복문 빠져나옴

==> 조건식이 참이든, 거짓이든 do의 반복수행문장이 적어도 한번은 실행됨
조건식 : 관계연산자, 일을 하는 method  
무한루프)

while(true){
  반복수행문장;
}
무한루프)

do{
   반복수행문장들;
   증.감소식;
}while(true);
  continue
  -반복문의 수행을 건너 뛸 때 사용
-continue를 반복문의 제일 마지막 줄에 기술하지 않는다
-조건식에 넣어서 사용(ex: if문)
  for(int i=0; i<10; i++){
  continue; //정의된 아랫줄을 실행하지 않는다
  System.out.println("반복수행문장"); ==> error
}


for(int i=0; i<10; i++){
  if(조건식){
     continue; //정의된 아랫줄을 실행하지 않는다

  } 
  System.out.println("반복수행문장");

}

◎ 특수문자 Escape Character

  • 문자열안에 사용하면서 정해진 기능을 수행하는 문자들
  • \문자 (\뒤에 나오는 하나의 문자로 정해진 기능이 수행된다)
  • 특수문자는 정해져있다
  • 형식
    • "\문자"
특수문자 기능
\n 개행 - 줄 바꿈
\r 커서를 그 줄에 가장 앞으로 이동
(Windows에만 존재)
windows는 커서를 앞으로 옮기고 줄을 변경해주므로 코드값이 \r\n으로 형성된다
\t Tab - tab 
\\ \를 사용할 때 (windows의 경로표현)
\" "를 사용할 때
\' '를 사용할 때 (\없이도 사용가능_간섭이 일어나지 않기 때문에)
\b backspace의 기능

※ white space : spacebar 나 tab key , enter key를 눌러서 생기는 공백


◎ 클래스와 변수

  • 변수(Variable)
    • 목적 : 프로그램에서 사용할 값을 메모리에 일시적으로 저장하기 위해
    • java에서는 istance variable, static variable, local variable 3가지 종류를 제공한다
    • 변수를 선언하는 위치에 따라 다른 변수가 만들어진다
    • 각각의 변수는 생명주기와 사용범위, 사용방법이 다르다
변수종류 instance(member)variable
특징 class field 에 선언한다
객체화하여 사용하는 변수
class를 객체화하면 객체마다 변수 생성
자동초기화
(개발자가 초기화값을 넣지 않아도 된다)
객체가 Garbage Collector 에 의해 사라질 때 메모리에서 사라진다
JVM 의 heap 메모리에 생성된다
static 영역에서는 instance 영역에 직접 접근할 수 없다 =사용방법=> 객체화
생성되는 객체마다 변수의 값을 따로 저장하고 사용해야할 때 사용(class 배울때 다시배움)
작성법 access modifier (접근지정자, 접근제한자, 접근수정자 _ 다 사용하는 용어)

access modifier data type variable name = default value;
접근지정자       데이터형    변수명         =  초기화값;
사용방법 class Test{
   int i; //instance 영역에 선언된 instance변수
   public static void main(String[] args){
      //static 영역
      Test t = new Test(); //객체화 : 클래스명 객체명 = new 클래스명();
      System.out.println( t.i ); //변수의 사용 : 객체명.변수명

      Test t1 = new Test();
      System.out.println( t1.i );
    }
}

Java Test
클래스를 실행했다고 instance variablememory에 올라가지 않는다.
-instance변수는 소스상에 눈에 보이지만 메모리에 올라가지 않기 때문에 사용할 수 없다.
-instance variable을 사용할려면 memory에 올려놓고 사용해야하는데
memory에 올려놓는 코드를 객체화(instance,  object) 라고 한다.
-객체화
문법
)  클래스명 객체명=new 클래스명();
-생성된 객체명으로 변수를 사용한다.
문법)   객체명.변수명    

instance 변수의
초기화 값

- instance변수를 선언하고, 필요한 곳에서 객체를 생성하면(객체화)
변수가 memory에 생성되면서 설정된 값을 저장한다.

→ 데이터 형에 따른 초기화 값 비교해보기 
class Test{
    int i; // 정수형 데이터형을 사용한 변수는 초기화 값으로 0이 설정된다. 
    char c;// 문자 데이터형을 사용한 변수는 초기화 값으로 \u0000이 설정된다.
    double d;// 실수형 데이터형을 사용한 변수는 초기화 값으로 0.0이 설정된다.
    boolean b;//불린형 데이터형을 사용한 변수는 초기화 값으로 false가 설정된다.
    int[] arr; //참조형 데이터형을 사용한 변수는 초기화 값으로 null 이 설정된다.
    String s; //                                      
    Integer ii;//                                     
    MyClass mc; //                                
}

 

접근지정자

변수의 접근지정자
폴더개념 public 클래스 외부에서 사용가능
protected 패키지가 다르면
상속관계의 자식클래스에서 사용가능
패키지가 같다면
같은패키지, 다른 클래스에서 사용가능
private 클래스 안에서만 가용가능
default 변수앞에 아무것도 선언하지 않은것
패키지가 다르면 사용불가
같은패키지, 다른 클래스에서 사용가능
메모리개념 static 공용메모리에 생성
final 값 변경 불가
transient 직렬화 방지키워드(IO Stream을 타고 나가지 못하도록 막는 일)

데이터형 

  • 기본형 데이터형, 참조형 데이터형 사용가능

변수명

  • 소문자로 시작한다
  • 여러개의 단어로 변수명이 구성되면 낙타체_첫단어는 모두 소문자+나머지 단어는 첫글자만 대문자
  • 변수명에 특수문자를 포함하지 않는다 (underbar 정도만 사용 예: int user_Value=0;)

 

▼ instance 변수에 설정된 접근지정자와 사용가능 범위 ▼

접근 지정자 클래스 패키지 자식 클래스 전체 세계(project)
public o o o o
protected o o o ×
無 (default) o o × ×
private o × × ×

▼아래 글 참고▼_접근지정자

2020/09/10 - [개발/JAVA] - DAY+11 클래스와 메소드 심화(1)/ getter,setter,생성자

 

DAY+11 클래스와 메소드 심화(1)/ getter,setter,생성자

◎ 접근제어 접근 지정자 클래스 패키지 자식 클래스 전체 세계(project) public o o o o protected o o o × 無 (default) o o × × private o × × × 클래스에 있는 변수나 메소드에 마음대로 접근하는 것을..

jjiny-bbany.tistory.com

2020/09/03 - [개발/JAVA] - DAY+10 메소드 (method)

 

DAY+10 메소드 (method)

◎ 메소드(method) 메소스 : 입력을 받아서 처리결과를 반환하는 상자 각 메소드는 하나의 작업만 하도록 작성 (권장함) 각 메소드는 이름을 가지고 있다 (이름을 통해 호출//무명함수는 제외) 구조

jjiny-bbany.tistory.com