-Field(필드)

  • Class블록 안에서 변수를 선언해주는 부분
  • 초기화도 할수 있지만 특별한 경우가 아니면 초기화 없이 선언만 한다
  • Field, Method, Constructor 모두 위치가 정해져 있는 건 아니지만 상단에  Field, 중간에 Constructor, 하단에 Mehtod를 작성해주는 것이 일반적이다
  • Field에서 선언해주는 변수를 맴버변수라고 부르며 외부에서도 값을 가져오거나 변경이 가능하다
  • public class Test {
    	//Field
        String str;
        int num;
        boolean flag;
    }
  • 변수의 타입은 기본타입부터 레퍼런스 타입까지 모두 선언과 사용이 가능하다
  • public class TestExample {
    	public static void main(String[] args) {
    		Test test = new Test();
            
    		System.out.println(test.str);
    		test.str = "Hello";
    	}
    }
  • 위의 코드와 같이 main이 들어간 TestExample클래스에서 Test 클래스를 불러와서 출력하거나 변경하는 것이 가능하다.
  • Field에서 선언한 변수들의 초기값은 앞선 포스팅에 나와있듯이 기본타입은 0, 0.0, false 등이고 참조 타입의 기본값은 모두 null값으로 초기화된다.
  • 변수의 사용은 인스턴스 변수, 즉 test뒤에. 을 붙여 사용해주면 된다.
  • Test Class를 사용해 여러 개의 인스턴스(객체)를 생성했을 때 각 인스턴스 별로 갖고 있는 메모리의 주소 값이 다르므로 동일한 내용이 들어있다 해도 각 인스턴스 안에 변수는 다른 값을 가지고 있다.
  • public class TestExample {
    	public static void main(String[] args) {
    		Test test1 = new Test();
    		Test test2 = new Test();
            
    		test1.str = "Hello";
    		System.out.println(test2.str);
    	}
    }
  • 위와 같이 코드를 작성했을 때 test2.str의 값은 null이 나오게 된다.
    • test 1.str의 주소와 test2.str의 주소가 다르기 때문에 이런 결과가 나오게 되는데 만약 test 1과 test2의 주소가 같은 주소를 참조한다면 test2.str 또한 Hello가 되었을 것이다.
    • 이를 통해 인스턴스 생성 시 각각의 인스턴스는 다른 주소 값에 새로 생성된다는 걸 알 수 있다.

-개요

여러 부품을 모아 하나의 제품을 만들듯이 소프트웨어를 개발할 때, 여러 객체(부품)를 모아서 하나의 완성된 프로그램을 만드는 것을 객체지향 프로그래밍이라고 하며 영어로는 OOP(Object Oriented Programming)라고 한다.

  • 객체
    • 물리적으로 존재하거나 추상적으로 생각할 수 있는것들 중에서 자신의 속성을 가지며 식별 가능한 것을 의미
    • 필드와 메소드로 구성된다
    • 필드
      • 값, 변수라고 볼 수 있다
    • 메서드
      • 객체의 동작을 나타낸다
    • 예를 들어 사람이라는 객체가 있다고 가정한다
      • 이 사람은 이름, 나이, 키, 몸무게, 성별 등의 여러 가지 속성을 가지고 있는데 이를 필드라고 한다
      • 이 사람이 먹고, 자고, 일어나고, 움직이는 등 수없이 많은 행위들을 하는데 이를 메서드라고 한다.
      • 이처럼 어떠한 사물, 사람 등을 객체로 생각해볼 수 있고 그 객체가 가지고 있는 속성 값들을 필드, 그 객체가 동작하는 모든 행위 들을 메서드라고 한다
  • 객체의 상호작용
    • 객체는 객체끼리 상호작용을 한다
    • 사람이 리모컨으로 tv를 조작하는 것과 같은 개념이다
      • 사람이라는 객체가 리모컨이라는 객체의 버튼을 누르면 리모컨은 tv로 전원을 키라는 동작을 전달한다.
      • tv는 리모컨이 전달한 전원을 켜라 라는 행위를 받아 전원을 켜게 되는데
      • 리모컨의 버튼이 눌러졌을 때 하는 행동, tv가 리모컨의 명령을 받았을 때 하는 행동들을 메서드 호출이라고 하며 이러한 행동들과 연관관계를 객체의 상호작용이라고 한다
  • 객체와 클래스
    • 객체
      • 앞서 말한 현실의 모든 사람, 사물 그리고 가상의 어떠한 무언가도 객체가 될 수 있다
    • 클래스
      • 위의 객체를 만들기 위해서 설계도가 필요하다
      • 물건으로 예를 들면 자동차의 경우 자동차의 설계도가 필요하다.
      • 바퀴의 사이즈, 핸들, 각종 페달, 엔진 등 여러 가지 물건(필드)이 필요하고 자동차에서 어떠한 행위가 이루어졌을 때, 액셀을 밟는다던가 시동을 켠다거나 하는 행위(메서드)를 작성한 설계도가 필요할 것이다.
      • 이러한 부분들을 클래스에 작성을 해주는 것이다.
        • 자동차 클래스
          • 필드 : 바퀴, 색상, 기어, 엔진, 페달....
          • 메서드 : 시동이 걸린다. 와이퍼가 움직인다. 앞으로 간다. 멈춘다.
          • 이렇게 클래스(설계도)를 작성할 수 있다
      • 생성
        • 클래스 파일 생성 시 주의사항
          • 이름의 첫 글자는 꼭 대문자로 작성한다
          • 첫 글자에는 숫자가 올 수 없다
          • $, _ 외에 특수문자는 사용이 불가능하다
          • 자바 예약어는 사용이 불가능하다
          • 한글 사용이 가능하지만 일반적으로 사용되지 않고, 사용 시에 인코딩 오류가 발생할 수도 있다
          • 기본적으로 변수의 선언 와 동일하다고 생각하면 된다
        • 클래스 사용법
        • public class 클래스이름 {
          	
          }
        • 위와 같이 생성한 클래스 파일에 작성을 해주면 된다
        • 클래스 이름은 파일명과 같아야 한다.
        • 앞에 붙은 public의 경우 접근제어자인데 후에 기술할 예정이다
        • 일반적으로 한 개의 클래스파일에는 한개의 클래스만 정의를 하지만 2개 이상 정의도 가능하다.
        • 클래스 내부에는 필드, 메서드, 생성자가 사용될 수 있다.
        • public class Car {
          	//필드 Feild
              String color;
             	int carNumber;
              // etc......
              
              //메소드 Method
              public String moveFront() {
              	return "전진 합니다.";
              }
              
              //생성자 Constructor
              Car() {
              	String color = white;
              }
          }
        • 위와 같은 구조인데 안의 세부적인 내용과 객체, 클래스 등 앞서 기술한 내용들을 다음 포스팅에서 차근차근 다뤄보겠다.

-열거 타입

  • 한정된 값만을 갖는 타입을 열거 타입이라고 한다.
  • 어떠한 값들을 열거한다.
  • 열거 상수를 저장하는 타입
    • 상수 : 변하지 않는 값 / 변수의 형태를 가지고 있지만, 한번 값을 저장하면 변경할 수 없음
  • public enum Week {
    	MODAY,
    	TUESDAY,
    	WEDNESDAY,
    	THURSDAY,
    	FRIDAY,
    	SATURDAY,
    	SUNDAY
    }
  • 관례적으로 상수는 대문자로 작성을 해준다.
  • ctrl + shift + x : 선택한 문자들을 대문자로 바꿔줌 / ctrl + shift + y : 선택한 문자를 소문자로 바꿔줌
  • Eclipse에서는 파일을 new탭에서 생성해 줄 때 enum으로 class혹은 package처럼 파일을 생성해 줄 수 있다.
  • 저장된 이름 자체가 값이다.

-열거 타입 메서드

  • 열거 타입의 메서드 중 위의 코드와 같은 열거 타입으로 작성된 코드가 있다.
  • 오늘이 어떤 요일인지 반환해주는 함수이며 코드를 열어 확인해보면 열거 타입인걸 확인해 볼 수 있다.
  • 예전에는 Calendar와 Date객체를 사용했지만 이 두 가지는 보안상 사용을 안 하는 것이 좋다
  • LocalDate.now().getDayOfWeek(); 이 코드를 사용하는 것을 권장한다.

-2차원 배열(+ 다차원)

앞서 포스팅한 배열은 1차원 배열로 1행 + n열을 가지는 배열이다.

2차원 배열은 n행 + n열을 생각하면 된다. 흔히 생각하는 표 모양을 떠올리면 될 것이다.

2차원 이상의 3차원부터는 x, y, z로 3차원(3D) 이렇게 생각을 하면 되는 데 사용할 일이 없을 것이고 혹시나 사용이 필요하다면 다른 블로그의 포스팅을 찾아보자...

*아직 저의 역량 밖입니다...

 

-사용 방법

    • int[][] num1 = new int[10][10];
      int[][] num2 = {{1, 2, 3}, {4, 5, 6}};
    • 위의 방식으로 선언과 초기화가 가능하다 
    • [10][10]으로 만들면 10행 10열이 생성이 되고
    • 첫 번째 방법에서 첫번째 오는 대괄호에는 꼭 길이를 설정해줘야 하지만 두 번째[]부터는 값을 따로따로 초기화해줄 수 있다.
    • 만약 num1 [1][8] 이렇게 호출을 한다면 2번째 행 9번째 칸의 값이 출력이 될 것이다.
    • 행과 열의 개념만 이해를 한다면 사용을 하는 것은 1차원 배열과 동일하다
    • 단 주의할 점은 num1의 길이는 첫 번째 []의 길이가 나오고 두 번째[]의 길이 값을 추출하고 싶다면 먼저 행을 선택하고 그 행의 길이를 찾으면 된다
      • 예를 들어 2행의 길이를 알고 싶다면
      • num1 [1]. length라고 해야 한다.
      • 첫 번째 방법으로 초기화를 한다면 모든 행의 길이가 같겠지만 두 번째 방법으로 초기화를 할 경우 각 행의 길이가 달라질 수 있다.

 

-배열 복사

만약 배열의 크기를 더 키우기 위해 크기가 더 큰 배열을 만들고 그 배열에 복사를 해서 값을 넣어줄 때 사용하는 방법이 두 가지 있다.

int[] arr1 = new int[5];
int[] arr2 = new int[10];

for(int i = 0; i < arr1.length; i++) {
	arr2[i] = arr1[i];
}

위와 같이 코드를 작성해주면 arr1의 배열이 arr2의 배열에 0번 index부터 저장이 되며 남은 자리는 타입에 맞게 초기화가 되어 위의 코드 같은 경우 0으로 4번 index~9번 index까지 저장이 된다.

 

하지만 항상 for문을 작성해주고 길이를 구하고.... 귀찮다

프로그래머는 귀찮은걸 싫어하고 코드는 더 간결하고 보기 쉬워야 한다

그렇기 때문에 사용할 수 있는 다른 방법이 있다.

 

int[] arr1 = new int[5];
int[] arr2 = new int[10];

System.arraycopy(arr1, 0, arr2, 0, arr.length);

이름 그대로 배열을 복사해주는 함수다

첫 번째, 두 번째 인자로 원본 배열과, 시작할 위치

세 번째, 네 번째 인자로 새로운 배열과, 시작할 위치

다섯 번째 인자로 복사를 할 개수를 입력해주면 간편하게 복사가 가능하다

 

그렇다면 복사가 잘 되었는지 확인을 해보자

for(int i = 0; i < arr2.length; i++) {
	System.out.print(arr2[i]);
}

실행해 보면 배열 안의 코드가 잘 나오는 걸 확인할 수 있다.

 

-향상된 for문

for문을 작성할 때면 항상 써줘야 할 것들이 너무 많다.

조건, 초기화 변수, 증감식... 배열을 단순히 순서대로 출력을 하기 위해서 많은 코드를 써주는 건 힘들다

그때 향상된 for문은 사용해서 행복해질 수 있다.

for(int i : arr2) {
	System.out.print(i);
}

복사에서 봤던 for문과 정확하게 일치하는 결과를 얻을 수 있다.

  • 사용법
    • 소괄호 안에 배열과 같은 타입의 변수를 하나 선언해준다.
    • 그 뒤 콜론(:)을 입력하고 출력하고자 하는 배열을 넣어준다
    • 실행을 하면 우측에 입력해준 배열의 0번 index부터 끝까지 for문이 한번 돌 때마다 차례대로 i에 들어가고 실행문에서 i를 출력하면 순서대로 나오는 것을 볼 수 있다.
    • 배열의 값을 sum에 모두 더할 때, 배열을 순서대로 출력해야 할 때 사용하면 좋다.
    • 하지만 index를 사용해서 조건을 주고 출력을 해야 한다면 기본 for문을 사용하는 것이 좋다.

-개요

  • 많은 양의 데이터를 처리하기 위해서 사용
  • 데이터를 연속된 공간에 나열하고 각 데이터에 Index를 부여한 자료구조
  • 같은 타입의 데이터만 저장이 가능하다
  • 처음 선언한 데이터의 길이 값이 고정되어 늘리거나 줄일 수 없다
  • 현재는 거의 사용하지 않고 arrayList라는 클래스를 사용한다

 

-사용

  • 선언
    • type[] 변수명;
      type 변수명[];
    • 대괄호를 type뒤에 붙여도 되고 변수명 뒤에 붙여줘도 작동이 되지만 자바에서는 일반적으로 type뒤에 작성해준다
    • type에는 기본타입뿐 아니라 참조 타입도 넣어줄 수 있다
      • int [] num;이라고 선언 시 num이라는 배열에는 int타입의 리터럴만 저장이 가능
      • String [] str;이라고 선언 시 str이라는 배열에는 String타입의 리터럴만 저장이 가능
  • 초기화
    • type[] 변수명 = new int[배열의 길이];
      type[] 변수명 = {리터럴 값1, 리터럴 값2, 리터럴 값3...};
    • 두 가지 방법으로 초기화가 가능하다
    • 첫 번째 방법에서 배열의 길이 부분에 5를 넣어준다면 5칸의 배열이 생성된다
      • int[] num = new int[5];
        num[0] = 1;
        num[1] = 2;
        num[2] = 3;
        num[3] = 4;
        num[4] = 5;
      • 위와 같이 길이를 5로 정해주면 int타입의 5칸짜리 배열 num이 생성된다.
      • 그 뒤 배열의 index번호에 값을 입력해 주면 된다.
      • index는 0부터 시작하므로 꼭 기억하도록 하자 
      • 만약 어떤 위치의 값을 출력해주고 싶다면 -1을 해주면 된다
        • 5칸 배열의 3번째 값을 출력하고 싶다면 3 - 1을 해주면 2이기 때문에 세 번째 칸의 배열 값이 나온다
    • 두 번째 방법은 리터럴 값을 넣어준 만큼 길이가 설정된다
    • new로 초기화를 진행한 경우 기본적으로 들어가는 값들이 있다
      • 정수
        • byte : 0
        • char : '\u0000'
        • short : 0
        • int : 0
        • long : 0L
      • 실수
        • float : 0.0F
        • double : 0.0
      • 논리
        • boolean : false
      • 참조
        • Class : null
        • Interface : null
    • 초기화를 했을 때 아무 값도 넣지 않을 경우 위와 같이 타입별로 초기화가 된다.
  • 값 입력
    • int[] num = new int[5];
      for(int i = 0; i < 5; i++) {
      	num[i] = i + 1;
      }
    • 이런 식으로 값을 넣어주는 방법이 있다
    • 선언과 초기화를 동시에 한다면 중괄호 안에 리터럴을 직접 입력해주면 되지만 배열의 생성만 했다면 위와 같이 자료를 삽입해 줘야 한다
    • 숫자의 경우 index를 순차적으로 올려가면서 위의 코드와 같이 1~5까지의 숫자를 0~4까지의 index값에 삽입이 가능하다
    • 반복문을 사용해주지 않을 경우 num [0]~num [4]를 하나하나 사용해주면서 각각 값을 넣어줘야 한다.
  • 배열 길이
    • 배열은 길이를 구하는 일이 많을 것이다 이때마다 배열의 길이를 직접 써주는 것보다는 Length함수를 사용하면 간편하게 길이를 구할 수 있다
    • int[] num = {1, 8, 9, 2, 3, 4, 9, 5, 0, 3, 4};
      
      System.out.println(num.length);
    • 11이 출력될 것이다.
    • 위의 코드와 같이 배열에 리터럴을 입력해 초기화를 해준 경우 길이를 구하려면(몇 칸인지 구하려면) 일일이 세줘야 하지만 length를 사용하면 컴퓨터가 알아서 해준다.
  • 사용
    • 배열 내부의 값 중 특정 칸에 어떤 값이 들어있는지 확인을 하려면 아래 코드를 참고하자
    • System.out.println(num[2]);
    • 배열 길이의 코드와 이어서 본다면 9가 출력이 될 것이다.
    • 앞서 말했듯 index는 0부터 시작한다.
    • 그렇기 때문에 2를 입력해주면 3번째 칸의 값이 출력이 된다.

-개요

JAVA는 문자열을 저장할 수 있는 기본 타입이 없다.

char를 생각했을 수도 있지만 char의 경우 한 글자씩만 표현이 가능하고 문자열은 저장을 할 수 없다.

그래서 문자열을 저장하기 위해 String의 참조타입이 나왔다.

 

-사용

String str1 = "안녕";
String str2 = new String("안녕");

두가지 방법으로 사용이 가능하다. 보통의 경우 str1의 방법으로 많이 사용을 하며 꼭 "(큰따옴표)로 묶어줘야 한다.

앞의 포스팅에서 기술 했듯이 str들의 문자가 같아도 참조하는 주소 값이, 실제로 저장되는 공간은 서로 다르기 때문에 ==같은 연산자를 사용했을 때 결괏값이 원하지 않는 방향으로 나온다.

 

new String으로 문자열을 선언하는 방식은 별로 좋지 않다.

스트링의 경우 스트링만 관리를 하는 String Pool이(Heap Area안에) 있다.

"안녕"이라고 선언후 또 "안녕"을 선언했을 때 String Pool안에 "안녕"이 있는지 확인을 하고 있다면 같은 주소 값을 참고한다.

이 경우 == 사용이 가능하다.

 

하지만 new를 사용했을때는  String Pool에 만들어지는 게 아니라 Heap Area에 따로 생성이 된다.

 

두 문자열이 같은지 확인을 하려면

String str1 = "안녕";
String str2 = "안녕";

System.out.println(str1.equals(str2));

//[문자열 변수].equals([같은지 비교할 변수 또는 "문자열"])

이렇게 .equals()를 사용해주면 된다.

위의 코드는 String Pool에 의해 관리되어 같은 주소 값을 갖고 있어 ==이 가능하지만 equals를 사용해보기 위해 간단하게 작성했다.

-개요

JAVA의 타입은 크게 기본 타입(Primitive Type)과 참조 타입(Reference Type)으로 나눌 수 있다.

  • 기본 타입(Primitive Type)
    • 실제의 값을 변수 안에 저장한다. 
    • 정수 타입 : byte, char, short, int, long
    • 실수 타입 : float, double
    • 논리 타입 : boolean
  • 참조 타입(Reference Type)
    • 실제값이 변수 안에 저장되는 것이 아니라 변수 안에는 실제값이 있는 메모리의 주소를 저장한다. 
    • 기본 타입을 제외한 모든 타입을 참조 타입이라고 한다.
    • 배열, 열거, 클래스 등이 있다.

 

-메모리 사용 영역

JAVA에서는 메모리를 7개의 영역으로 나눈다. 그중 가장 많이 사용되는 메모리 영역이 3가지 있다.

런타임 환경에서 코드를 실행하면서 코드가 스택에 쌓이고 인스턴스 생성 시 힙 영역에 저장이 되며 인스턴스의 constructor, method 등을 사용할 때 메서드 영역의 클래스의 내용이 불러와진다.

  • 메서드(Method)
  • JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
    • 클래스
      • 정적 필드
      • 상수
      • 생성자
      • 메서드
      • 코드 등을 분류해 클래스별로 저장
  • 힙(Heap)
    • 객체와 배열이 생성되는 영역 / new로 인스턴스 생성 시 힙 영역에 저장이 된다.
    • 기본자료형을 제외한 모든 자료형(Reference Type)이 이곳에 생성된다.
  • JVM 스택(Stack)
    • 메서드가 호출되면 프레임이 추가되고, 메서드가 종료되면 프레임이 제거된다
    • 자료구조의 스택과 동일하게 생각하면 된다.

 

-연산

참조변수의 연산 시 ==,!= 할 때 원하는 결괏값이 나오지 않을 것이다.

String str1 = "안녕";
String str2 = "안녕";

System.out.println(str1 == str2);

바로 뒤에 포스팅에 나오지만 true를 출력한다.

원하는 결괏값이지만 ==연산의 사용등은 아래와 뒤의 포스팅을 참고하자.

 

String은 기본 타입 변수가 아니기 때문에 변수에 저장되어 있는 값은 "안녕"이라는 글자 자체가 아닌 "안녕"이 저장되어 있는 주소의 주소 값이다.

 

그럼 str1과 str2의 보이는 값이 둘 다 "안녕"이므로 같은 주소에 저장이 되어있을까?

아니다 String자체는 다시 작성을 해보면

String str1 = new String("안녕");
String str2 = new String("안녕");

이렇게 작성이 된다. 위의 코드처럼 바로 선언을 하는 것과 new를 사용하는 것은 같은 코드이다.

그렇다면 조금 이해가 될 수도 있다.

str1과 str2는 new키워드가 붙어있다. 그러면 각각 새로 생긴 주소 값이 부여가 될 것이다.

그러면 == 혹은!= 연산자를 사용했을 때 생각한 것과 결과가 다를 것이다.

 

만약 같은 주소의 "안녕"을 str2에 넣어주고 싶다면

String str1 = "안녕";
String str2 = str1;

이렇게 작성을 해준다면 같은 주소의 값을 가진 str2를 생성할 수 있다. 하지만 이렇게 복사를 한다면 후에 문제가 생길 수도 있다. 나중에 얕은 복사 등을 알아볼 때 다시 보도록 하자

 

-Null, NullPointerException

Null : 값이 없음을 나타내 줌

NullPointerException : null값을 참조하고 있다는 Erorr

 

인스턴스 생성 시 new가 아닌 null값을 넣어주게 될 때 NullPointerException이 발생한다.

Random rnd = null;
rnd.nextLine();

널 포인터를 참조하고 있다는 뜻이고 위의 코드와 같이 참조할 객체(인스턴스)가 없는 상태에서 내부의 메서드를 사용하기 위해서 접근을 할 때 오류가 나타난다.

System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");
System.out.println("Hello!");

어떠한 코드를 반복적으로 실행을 해야 한다고 보자.

위의 코드와 같이 단순하게 반복을 하는 방법도 있다. 하지만 코드의 내용이 복잡해지고 양이 방대하게 많아진다면,

그리고 기본적으로 프로그래머는 반복, 막일을 싫어한다.

이런 여러 가지 이유에서 반복문이라는 것을 사용한다.

반복문에는 3가지의 종류가 있다.

  • for
    • for (1. 초기화식; 2. 조건식; 4. 증감식) {
      	//3. 반복될 코드
      }
    • for문은 위의 코드와 같이 작성할 수 있다
    • 보통 반복의 횟수를 알고 있을 때 사용한다
    • 조건식은 반복문이 얼마 동안 반복할 것인지를 설정해 줄 수 있다.
    • 중괄호 안의 코드는 조건이 true인 동안 반복될 코드를 작성할 수 있다.
    • for (int i = 0; i < 10; i++) {
      	System.out.println(i);
      }
    • 위의 코드는 0~9까지 출력을 해준다
    • 초기 화식과 증감식을 설명을 안 했는데 초기 화식은 반복문에 사용될 변수를 초기화해준다.
      • 이 변수의 개수는 상관없으며 변수는 for문 안에서만 사용이 가능하다.
      • 변수의 선언과 초기화는 변수 밖에서 하는 것과 마찬가지로 [type] [변수명] = [Value]; 작성한다.
    • 증감식은 조건식과 연관해서 보면 된다.
      • 조건식이 i가 10보다 작은동안, 즉 i가 9가 될 때까지 반복을 하며 10이 되면 반복을 종료하고 반복문을 빠져나간다.
      • 조건을 만족하기 위해서 1에서 설정해준 변수에 1씩 증가를 시켜준다.
        • 1씩이 아니여도 상관없다. i += 2;라고 한다면 2씩 증가될 것이다.
      • 조건식을 확인하고 내용을 실행하고 마지막으로 i에 1을 더해줄 것이다 이러한 순서로 2, 3, 4 이렇게 반복을 하면 i는 계속 증가될 것이고 결국엔 i의 값이 10이 되고 반복문을 종료할 것이다.
    • 시작 변수를 어떻게 설정하느냐, 조건식을 어떻게 하느냐에 따라서 출력 결과가 많이 달라지므로 연습을 많이 해봐야 한다.
      • 예를 들어 위의 코드에서 조건식의 부분만 i <= 10; 이렇게 만들어준다면 =하나 들어갔을 뿐인데 코드의 결과는 10이 추가로 출력이 된다.
      • 이처럼 많이 사용해보고 여러 문제들을 풀어보면서 사용법을 이해하고 이해되지 않으면 외워버리는 것도 방법이다.
    • continue
      • continue라는 코드를 중간에 넣어주면 '이번 실행은 건너 뛸꺼야 아무것도 하지 마'라는 말과 동일하다
      • for(int i = 1; i <= 10; i++) {
        	if(i % 2 == 0) {
            	continue;
                //2의 배수는 건너 뛰어라
                //i 나누기 2의 나머지가 0이면 2의 배수
            }
        	System.out.println(i);
        }
      • 코드 실행 결과를 보면 알 수 있듯이 if문의 조건이 만족하면 continue해라라고 했고 그 결과 홀수만 출력이 됐다.
      • 조건식에서 i를 2로 나눈 나머지가 0이면 continue를 하라고 했는데 결론적으로 2로 나누었을 때 나머지가 0이면 2의 배수이기 때문에 2의 배수(짝수)는 출력되지 않고 홀수만 출력된 것을 확인할 수 있다.
  • while
    • while(조건식) {
      	//반복될 코드
      }
    • 처음 보는 분들에게는 while이 더 쉬워 보일 수도 있겠다.
    • 일반적으로는 반복의 횟수를 모르는 경우 사용된다
    • 조건식 안에 Boolean으로 return 되는 값을 넣어주고 return값이 true인 경우 중괄호 안의 코드가 반복된다
    • while(true) {
      	System.out.println("Hello");
      }
    • 위와 같이 코드를 작성할 수 있는 데 따라 해보지 않기를 권장한다.
    • 앞서 말했듯이 반복의 횟수를 모르는 경우 사용하며 조건식이 true면 내용을 실행한다. 하지만 위의 코드 어디에도 while문을 빠져 날 수 있는 방법이 없다.
    • while문에서 위와 같이 코드를 작성할 경우 무한루프에 빠진다고 하고, while문을 빠져나오지 못하고 계속 while안에 영원히 머무른다는 소리다.
    • 코드가 짧고, 복잡하지 않다면 컴퓨터가 힘들어하지 않겠지만 내용이 복잡하고 실행할 내용이 많다면 얼마 가지 않아 다운될 것이다.
    • 정지 방법
      • Break
        • 중괄호 안에서 break를 입력해줄 경우 실행이 되다 break를 만났을 때 while문을 종료하고 빠져나간다
        • while (true) {
          	//Code 1
              //Code 2
              //Code 3
              //Code 4
              //Code 5
              break;
              //Code 6
              //Code 7
              //Code 8
          }
        • break를 만나면 빠져나간다. 그렇다면 break이후의 코드. 즉, code 6부터는 실행되지 않는다는 뜻이다.
        • 하지만 이렇게 아무런 조건 없이 break를 잡아준다면 한 번만 돌고 끝날 것이다 그렇게 때문에 조건문(if)을 사용해서 조건문의 return값으로 break를 넣어주는 게 좋다.
        • while(true) {
          	//Code 1
              //Code 2
              //Code 3
              //Code 4
              //Code 5
              if (/*빠져나갈 조건*/) {
              	break;
              }
              //Code 6
              //Code 7
              //Code 8
              
          }
        • 위와 같이 작성하면 if의 조건이 만족하기 전까지는 while문을 빠져나갈 일은 없을 것이다.
        • 반복문 혹은 switch가 중첩으로 들어가 있다면 label을 붙여서 지금의 위치를 빠져나갈 수 있다.
        • while(true) {
          	[Label Name]:for(int i = 0; i < 2; i++) {
              	if(i == 1) {
                  	break [Label Name];
                  }
              }
          }
        • 라벨의 이름을 정해서 나갈 위치를 잡아줄 수 있다.
        • continue도 동일하다.
      • 변수 사용
        • while문의 소괄호에는 Boolean값이 들어간다고 했는데 그렇다면 변수로도 컨트롤을 할 수 있다.
        • 사용방법은 break와 비슷하다
        • boolean flag = true;
          while(flag) {
          	//Code 1
              //Code 2
              //Code 3
              //Code 4
              //Code 5
              if (/*빠져나갈 조건*/) {
              	flag = false;
              }
              //Code 6
              //Code 7
              //Code 8
          }
        • 위와 같이 사용이 가능하지만, break는 만난 시점에 바로 빠져나가지만 변수를 저렇게 중간에 사용해줄 경우 변수가 false로 변해도 while의 조건을 인식하는 건 중괄호의 내용이 모두 끝나고 인식을 하기 때문에 flag가 중간에 false라고 바뀌어도 code6~8이 실행되고 flag가 true인지 false인지 확인하고 while문의 처리를 진행하게 될 것이므로 사용의 위치가 중요하다.
  • do-while
    • do {
      	//반복 내용
      } while (/*조건식*/)
       
    •  조건식이 true면 반복 내용을 실행하는 부분은 while문과 비슷하다.
    • 다른 점은 코드의 작성 순서를 보고 알 수도 있겠지만 먼저 수행하고 조건을 확인한다.
    • 조금 어려울 수도 있는데 그냥 위에서 코드가 쭉 내려오다가 조건에 상관없이 do를 먼저 실행을 해주고 조건식을 확인한다.
    • boolean flag = false;
      
      do {
      	System.out.println("true면 실행해");
      } while (flag);
      
      
    • 위의 코드 내용을 보면 알 수 있듯이 do는 조건과 상관없이 무조건 한 번을 실행한다.
    • 상황에 맞게 사용하면 된다.

'Back-end > JAVA' 카테고리의 다른 글

11. 참조 타입(Reference Type) - String  (0) 2021.06.17
10. 참조 타입(Reference Type) - 개념  (0) 2021.06.17
-컴파일러 에러  (0) 2021.06.15
8. 조건문(if, else, else if, switch)  (0) 2021.06.14
7. Operator  (0) 2021.06.11

+ Recent posts