1. 배열

 배열이라는 것은 동일한 자료형으로 선언된 변수들을 묶는 것이라 할 수 있습니다. 이는 변수를 하나씩 생성하는 것에 비해 관리가 매우 수월합니다. 만약 성적을 입력받는 프로그램을 만들고자 한다면 int형의 변수를 여러개를 생성하여 변수의 개수만큼 입력문을 받아야 할 것입니다. 하지만 배열을 사용한다면 하나의 반복문만으로도 모든 변수에 값을 저장할 수 있을 것입니다. 아래의 예시를 보도록 하겠습니다.

 

 - int kor=0;

   int eng=0;

   int mat=0;

 

   System.out.print("국어 : ");

   kor=sc.nextInt();

   System.out.print("영어 : ");

   eng=sc.nextInt();

   System.out.print("수학 : ");

   mat=sc.nextInt();

 

 이처럼 같은 구조를 반복해야 하는 메모리의 비효율성과 번거로움을 갖게 됩니다. 하지만 이를 배열로 해결한다면 아래와 같이 해결할 수 있습니다.

 

 - int[] sub=new int[3];

   String[] subject={"국어", "영어", "수학"};

   

   for(int i=0; i<subject.length; i++){
      System.out.println(subject[i]+" : ");

      sub[i]=sc.nextInt();

   }

 

 배열을 사용하면 훨씬 간단하고 효율적으로 코드를 작성할 수 있습니다. 

 

2. 일차원 배열

 배열에는 일차원 배열을 포함한 다차원 배열이 있습니다. 그 중 일차원 배열에 대해 알아보도록 하겠습니다. 다차원 배열이라고 해서 일차원 배열과 크게 다른 것이 없습니다. 단순히 []하나만 더 붙으면 차수가 올라갑니다. 우선 일차원 배열의 선언 방법부터 알아보도록 하겠습니다. 

 

 - 자료형[] 배열명;

   자료형 배열명[];

 

 위의 방식처럼 2가지의 방법으로 나타낼 수 있습니다. 이때 배열의 자료형으로는 기본 자료형을 비롯하여 String과 System같은 클래스 자료형도 가능합니다. 이후에 오는 배열명은 4byte의 레퍼런스형으로서 어딘가의 주소를 저장할 수 있는 자료형입니다. 그렇다면 배열의 초기화 방법에 대해 알아보도록 하겠습니다. 

 

 - 자료형[] 배열명 = {값1, 값2, 값3 ,,, 값n };  // 선언과 동시에 이루어져야 함

   배열명 = new 자료형[개수];   // 선언과 별개로 초기화 가능

   배열명 = new 자료형[]{값1, 값2, 값3 ,,, 값n };   // 선언과 별개로 초기화 가능

 

 초기화하는 방법에 대해 알아보았으므로 이제 사용하는 방법에 대해 알아보겠습니다. 우선 배열의 구조는 '배열명[인덱스]'와 같습니다. 이 인덱스는 숫자로 이루어져있으며 0부터 시작합니다. 예를 들어 int A[10];이라고 배열을 선언했다면 A배열은 0~9까지의 인덱스를 갖게 됩니다. 아래의 예시를 보도록 하겠습니다.

 

 - char[] ch = {'A', 'B', 'C'};

   System.out.println(ch[0]);

   System.out.println(ch[1]);

   System.out.println(ch[2]);

 

 위의 예시를 보면 선언과 동시에 초기화가 이루어진 것으로 실행해보면 각 글자가 한 줄 단위로 띄어져서 출력되는 것을 알 수 있습니다. 

 

 매번 코드를 작성할때 기본 양식에 main함수 부분을 보면 'public static void main(String[] args)'이라는 문구가 있는 것을 볼 수 있습니다. 이때 'String[] args'라는 부분은 각 프로그램마다 필요로 하는 것들을 매개변수를 통해 전달해주는 역할을 합니다. 이를 응용하여 아래의 코드를 살펴보도록 하겠습니다. 

public class Round08_Ex01 {

	public static void main(String[] args) {
		
		System.out.println("ar[0] = "+args[0]);
		System.out.println("ar[1] = "+args[1]);
		System.out.println("ar[2] = "+args[2]);

	}

}

 만약 이러한 코드가 있다고 가정할 때 컴파일 시에는 아무런 문제가 발생하지 않지만 실행해보면 문제가 발생하는 것을 확인할 수 있습니다. 이유는 실행 시에 기본 매개변수에 아무런 값도 넣어주지 않았기 떄문에 에러가 생기는 것입니다. 이를 해석해보면 선언만 하고 아무런 초기화 과정도 거치지 않았기 때문에 에러가 발생하는 것입니다. 그렇다면 프로그램을 실행하면서 매개변수로 임의의 글자를 넣어보도록 하겠습니다.

 이렇게 코드 내에서 초기화를 하지 않아도 매개변수를 통해 원하고자 하는 값을 출력이 가능하다는 것을 알 수 있습니다. 그렇다면 이클립스 프로그램에서 코드를 실행할 때에는 어떻게 매개변수를 전달하는지에 대해 알아보도록 하겠습니다. 우선 Run탭의 'Run Configurations' 항목을 들어가줍니다. 이후 중간부분의 'Arguments' 탭을 눌러줍니다.

 그런 후에 'Program arguments'부분에 전하고자 하는 값을 넣어준 후 'Run'을 눌러주면 아까와 같은 결과값이 나오는 것을 확인할 수 있습니다.

 

 그렇다면 이제 지금까지 배운 모든 것을 통합해서 성적을 출력하는 프로그램을 작성해보도록 하겠습니다.

import java.util.Scanner;

public class Round08_Ex04_2 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		String[] subname= {"국어", "영어", "수학"};
		int[] sub=new int[subname.length+1];  // 기존의 3개 과목에 총점도 추가해야하므로 +1
		float ave=0.0f;
		
		for(int i=0; i<sub.length-1; i++) {  // i는 0으로 초기화하고 sub변수의 길이까지 반복
			do {
				System.out.println(subname[i]+" : ");
				sub[i]=Integer.parseInt(sc.nextLine());
			} while(sub[i]<0||sub[i]>100);  // 입력 값이 0보다 작고 100보다 크면 다시 입력
			sub[sub.length-1]+=sub[i];  // sub배열의 마지막 인덱스에 총합 저장
		}
		
		ave=sub[sub.length-1]/(float)(sub.length-1);  // 총합 나누기 과목 수
		
		System.out.println();
		System.out.println("총점 : "+sub[sub.length-1]);
		System.out.println("평균 : "+ave);

	}

}

  위의 코드에서 sub.length와 같이 붙어있는 .length라는 것은 해당 배열이나 멤버의 크기(길이)를 나타냅니다. 이렇게 배열을 이용하면 복잡하고 번거로운 작업을 쉽고 효율적으로 처리할 수 있습니다.

 

3. 다차원 배열

 다차원 배열의 개념은 쉽게 말해 일차원 배열이 2개가 묶여있는 것이라고 보면 됩니다. 예를 들어 일차원 배열이 일직선의 길이라고 표현한다면 2차원 배열은 직선 2개가 모인 넓이, 3차원 배열은 넓이에 직선이 추가된 공간과 같은 개념으로 볼 수 있습니다. 다차원 배열도 일차원 배열과 선언, 사용하는 방법에 있어 같기 때문에 어려울 것은 없습니다.

 

 - 자료형[][] 배열명;

   자료형[] 배열명[];

   자료형 배열명[][];

 

 일차원 배열에 비해서 대괄호( [] ) 하나가 더 생겨난 것입니다. 그렇다면 초기화 하는 방법에 대해 알아보도록 하겠습니다.

 

 - 자료형[][] 배열명={{값1, 값2, 값3 ,,, 값n}, {값a, 값b, 값c ,,, 값n}};

   배열명 = new 자료형[][]{{값1, 값2, 값3 ,,, 값n}, {값a, 값b, 값c ,,, 값n}};

   배열명 = new 자료형[개수][개수];

   배열명 = new 자료형[개수][];

 

 일차원 배열과 다른 점이라면 초기화를 할 때 중괄호( {} )를 2개 사용한다는 것입니다. 이러한 다차원 배열의 값을 나타내는 방식 또한 일차원 배열과 같이 '배열명[인덱스][인덱스]'를 통해 나타냅니다. 그렇다면 다차원 배열의 예시로 아래의 코드를 살펴보도록 하겠습니다. 이 코드는 세 학생의 점수를 입력받아 각 총점과 평균을 나타내는 코드입니다.

import java.util.Scanner;

public class Round08_Ex06 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		String[] subject= {"국어", "영어", "수학"};  // 입력받을 과목 3개
		int[][] sub = new int[3][subject.length+1];  // 과목3개 + 총합
		float[] ave = new float[3];
		
		for(int k=0; k<sub.length; k++) {  // 과목+총합 배열의 수만큼 반복
			for(int i=0; i<sub[k].length-1; i++) {  // 각 학생의 과목 배열 수만큼 반복
				do {
					System.out.print(subject[i]+" : ");
					sub[k][i]=sc.nextInt();
				} while(sub[k][i]<0||sub[k][i]>100);  // 입력값이 0보다 작거나 100보다 크면 다시
				sub[k][sub[k].length-1]+=sub[k][i];  // 총점은 각 과목의 합
			}
			ave[k]=sub[k][sub[k].length-1]/(float)(sub[k].length-1);
		}
		
		for(int k=0; k<sub.length; k++) {
			System.out.println();
			System.out.println("총점 : "+sub[k][sub[k].length-1]);
			System.out.println("평균 : "+ave[k]);
			
		}
	}
}

 위 코드의 실행화면은 아래와 같습니다.

 이상으로 배열에 대해 알아보았습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

Class - Field  (0) 2021.03.16
객체 지향 프로그래밍  (0) 2021.03.16
자바 메서드 - 문제  (0) 2019.04.22
자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19

1. 계산기 프로그램을 작성하되 각 연산자의 연산은 메서드를 통해서 작성

 

 - 코드

import java.util.Scanner;

public class Test01 {
	
	public static int plus(int num, int num2) {  // 더하기 메서드
		int tot = num + num2;
		return tot;
	}
	
	public static int minus(int num, int num2) {  // 빼기 메서드
		int tot = num - num2;
		return tot;
	}
	
	public static int multiply(int num, int num2) {  // 곱하기 메서드
		int tot = num * num2;
		return tot;
	}
	
	public static int division(int num, int num2) {  // / 연산 메서드
		int tot = num / num2;
		return tot;
	}
	
	public static int division2(int num, int num2) {  // % 연산 메서드
		int tot = num % num2;
		return tot;
	}

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("su1 : ");   // 첫 번째 수를 입력받아 저장
		int first = sc.nextInt();
		System.out.print("yon<+, -, *, /, %> : ");
		String yon = sc.nextLine();   // 연산자를 입력받아 저장
		System.out.print("su2 : ");
		int second = sc.nextInt();   // 두 번째 수를 입력받아 저장
		
		if(yon.equals("+"))  // 연산자가 +일 경우 더하기 메서드 실행
			System.out.println(first+" "+yon+" "+second+" = "+plus(first, second));
		else if(yon.equals("-"))  // 연산자가 -일 경우
			System.out.println(first+" "+yon+" "+second+" = "+minus(first, second));
		else if(yon.equals("*"))  // 연산자가 *일 경우
			System.out.println(first+" "+yon+" "+second+" = "+multiply(first, second));
		else if(yon.equals("/"))  // 연산자가 /일 경우
			System.out.println(first+" "+yon+" "+second+" = "+division(first, second));
		else if(yon.equals("%"))  // 연산자가 %일 경우
			System.out.println(first+" "+yon+" "+second+" = "+division2(first, second));

	}

}

 

2. 문자열을 입력받는 범용 메서드를 작성

 

 - 코드

import java.util.Scanner;

public class Test02 {
	
	public static String input() {
		
		String str;
		Scanner sc = new Scanner(System.in);
		return str = sc.nextLine();
		
	}

	public static void main(String[] args) {
		
		String name="";
		System.out.print("이름을 입력하세요 : ");
		name = input();   // 이름을 입력받을 때 input()메서드 실행
		
		System.out.println(name+"님, 안녕하세요");
		
	}

}

 

3. 특정 수를 입력받는 범용 메서드를 작성

 

 - 코드 

import java.util.Scanner;

public class Test03 {
	
	public static int function(String str) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println(str + " : ");
		int tmp = sc.nextInt();
		return tmp;
		
	}

	public static void main(String[] args) {
		
		int num = function("국어");  // function()메서드에 매개변수로 '국어' 전달
		System.out.println("국어 점수는 : "+num+"입니다");

	}

}

 

'프로그래밍 > JAVA' 카테고리의 다른 글

객체 지향 프로그래밍  (0) 2021.03.16
자바 배열  (0) 2019.04.25
자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17

1. 메서드의 정의 & 용법

 현재까지 자바를 공부하면서 다른 언어들과는 다른 규칙들이 있는 것을 알 수 있었습니다. 모든 코드는 클래스라는 파일 안에 작성되고 실질적으로 이루어지는 내용은 main함수 안에 작성해야 이뤄지는 것을 알 수 있었습니다. 메서드란 쉽게 말해서 C언어에서 함수라고 불리는 부분을 메서드라고 부를 수 있습니다. 하지만 C언어에서와 마찬가지로 한 메서드 안에 많은 양의 코드를 작성하는 것은 비효율적이고 복잡하기 때문에 이를 단순화하기 main메서드 외의 다른 메서드를 만들어 사용합니다. 우선 메서드의 형태를 알아보도록 하겠습니다.

 

 - 접근_제한자 [ 지정 예약어 ] 반환형 메서드명( 매개_변수 ) [ throws 예외_클래스들 ]

   {

     내용;

   }

 

 위의 메서드 형식을 자세하게 알 필요는 없습니다. 물론 다양한 요소들이 바뀔 수 있지만 이는 추후에 여러 예제를 보고 더 공부하게 되면 자연스레 알게 되는 것이므로 아래의 형식만을 살펴보도록 하겠습니다.

 

 - public static 반환형 메서드명 ( 매개_변수들 ) [ throws 예외_클래스들 ] 

   { 

     내용;

   }

 

 앞서 보았던 형식과는 크게 다른 것은 없지만 접근 제한자를 public 으로 사용하고 지정 예약어를 static으로 고정한다는 것이 약간 다릅니다. 여기서 알고 넘어가야 할 것은 static 메서드는 static 메서드에서만 사용이 가능하다는 것입니다. 이는 main메서드는 static으로 선언되어 있으므로 main메서드에서 다른 메서드를 호출하여 사용하려면 어쩔 수 없이 static으로 선언되어야 합니다.

 

 1] 반환형

  반환형이란 메서드가 내용을 실행하고 되돌려주는 값을 의미합니다. 때문에 main메서드나 다른 메서드에서 해당 메서드를 호출했다면 내용을 실행하고 다시 자신을 호출했던 메서드에게 결과값을 돌려주어야 합니다. 이때 반환형에는 void를 포함한 여러 자료형이 올 수 있지만 void를 사용했다면 아무것도 돌려주지 않아도 된다는 의미이고, 자료형으로 선언했다면 결과값을 각 자료형에 맞게 반환해주면 됩니다.

 

 2] 메서드명

  메서드명이라는 것은 일련의 이름이기 때문에 main메서드를 제외한 메서드의 이름은 사용자가 임의로 지정할 수 있습니다. 

 

 3] 매개 변수

  매개 변수라는 것은 메서드가 실행될 때 안의 내용을 수행하기 위해 필요로 하는 값을 호출과 동시에 넘겨주는 것입니다. 이는 사용자가 메서드를 어떻게 작성하느냐에 따라 필요할 수도, 필요하지 않을 수도 있습니다.

 

 4] 에외 클래스

  앞서 입력과 출력을 처리할 때에는 '예외처리'라는 것을 해주어야 한다는 것을 배웠습니다. 이는 main메서드에서만 해당되는 것이 아니기 때문에 다른 메서드에서도 필요시 입력해주어야 합니다.

 

 이제 예제를 통해 실질적으로 어떻게 사용되는지에 대해 알아보도록 하겠습니다.

public class Round07_Ex01 {

	public static void x() {
		for(int i=0; i<5; i++) 
			System.out.print("*");
		return;   // 반환형이 void인 경우에는 생략 가능
	}
	
	public static void main(String[] args) {
		
		x();
		System.out.println("\nHello");
		x();
		System.out.println("\nJava");
		x();
		System.out.println("\n!");
		x();
		return;   // main메소드에도 원래는 이 구문이 있어야 하지만 자동 생략
	
	}

}

 위의 코드의 결과를 살펴보면 아래와 같습니다.

 위처럼 메서드를 사용했을 때의 결과를 알 수 있습니다. 만약 이러한 결과가 나오기 위한 코드를 작성할 때 메서드를 사용하지 않고 main메서드 안에서만 해결하려 했다면 for문을 각 문장사이마다 출력해야 하는 번거로움이 있었을 것입니다. 이렇게 메서드를 사용하는 것을 수학에서의 치환과정과 같다고 볼 수 있습니다.

 

 위의 코드를 보면 메서드 x()와 main()의 반환형은 void인 것을 알 수 있는데 이때는 return;을 써주지 않아도 정상적으로 작동하는 것을 확인할 수 있습니다.

 

2. 메서드의 종류

 메서드는 어떤 방식으로 호출되느냐에 따라 크게 3가지로 나눌 수 있습니다. 앞서 봤던 코드처럼 단순한 이름을 호출함으로써 실행되는 'Call By Name', 이름에 매개변수가 추가되어 데이터를 처리하는 'Call By Value', 객체의 주소를 이용해 내용 데이터를 변화시키는 'Call By Reference'가 있습니다. 'Call By Reference'는 알아야 할 요소가 많으므로 추후에 배우도록 하겠습니다.

 

 'Call By Name'은 이름을 통해 메서드를 호출하는 방식으로, public static void aaa() 와 같이 매개 변수 없이 이름만으로 호출이 가능한 메서드가 'Call By Name'에 해당됩니다.

 

 'Call By Value'는 메서드의 매개 변수를 이용하는 방식으로 각 매개 변수는 개수, 자료형에 대한 제한이 없고 클래스형이 사용되어도 무관합니다.

 

3. 반환형

 반환형이라는 것은 해당 메서드가 실행이 완료된 후 반환하는 값을 말합니다. 대표적인 예로 2개의 수를 입력받아 더 큰 수를 반환하는 메서드가 있습니다. 이렇게 결과값의 반환이 필요한 메서드에서는 return이라는 에약어를 통해 결과값을 리턴합니다.

 

 이제 이러한 모든 것들을 섞어놓은 예제를 보도록 하겠습니다.

import java.io.IOException;
import java.util.Scanner;

public class Round07_Ex02 {
	
	public static int aaa() throws IOException {  // 둘 중 큰 수를 출력하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		if(a>b) 
			return a;
		return b;

	}
	
	public static void bbb() throws IOException {  // 두 수 사이의 합을 구하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		int tot = 0;
		if(a>b) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		
		for(int i=a; i<=b; i++) 
			tot+=i;
		
		System.out.println(a+" - "+b+"사이의 합 : "+tot);
		
	}
	
	public static String ccc(int x, int y, int z) {  // 세 수를 내림차순으로 정렬하는 함수
		if(y>=x&&y>=z) {
			int tmp = x;
			x = y;
			y = tmp;
		} else if(z>=x&&z>=y) {
			int tmp = x;
			x = z;
			z = tmp;
		}
		
		if(z>=y) {
			int tmp = y;
			y = z;
			z = tmp;
		}
		
		String abc = x+">="+y+">="+z;
		return abc;
	}

	public static void main(String[] args) throws IOException {  // 메인 함수
		
		Scanner sc = new Scanner(System.in);
		int x = 0;
		
		while(true) {
			System.out.print("1.최대수  2.사이합  3.수나열  4.종료 : ");
			x = sc.nextInt();
			if(x == 1) {
				int k = aaa();  // 1이 입력되면 aaa함수 호출
				System.out.println("둘 중 최대수는 "+k+"입니다");
			} else if(x == 2)
				bbb();  // 2가 입력되면 bbb함수 호출
			else if(x == 3) {
				System.out.print("첫번째 수 : ");
				int first = sc.nextInt();
				System.out.print("두번째 수 : ");
				int second = sc.nextInt();
				System.out.print("세번째 수 : ");
				int third = sc.nextInt();
				String str = ccc(first, second, third);  // 3이 입력되면 세 수를 입력받고 ccc함수를 호출하면서 매개변수로 전달
				System.out.println("내림차순은 : "+str);
			} else if(x == 4)
				break;  // 4가 입력되면 탈출
			else
				System.out.println("잘못 입력하셨습니다");
			
			System.out.println();
		}
		
	}

}

 위의 코드는 1~4부터 까지의 숫자 중 하나를 입력받아 각 숫자에 맞는 메서드를 실행하는 프로그램입니다. aaa는 더 큰 수를 출력하는 메서드이고, bbb는 두 수 사이의 합을, ccc는 세 수를 내림차순으로 정렬하는 메서드입니다. 이러한 메서드를 통해 코드를 더 효율적이고 간단하게 생성할 수 있습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 배열  (0) 2019.04.25
자바 메서드 - 문제  (0) 2019.04.22
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17

1. 문자 하나를 입력받아 대문자인지 소문자인지를 판별하는 프로그램

 

 - 코드

import java.io.IOException;
import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) throws IOException {
		
		System.out.print("문자 입력 : ");
		char ch = (char)System.in.read();
		
		if(ch>='A'&&ch<='Z') 
			System.out.println(ch+"는 대문자");
		else 
			System.out.println(ch+"는 소문자");

	}

}

 

2. 연도를 입력받아 윤년인지 아닌지를 판별하는 프로그램( 윤년은 4년마다 한번씩 있고 100으로 나누어떨어지면 윤년이 아니지만, 100으로 나누어떨어지는 년도중 400으로 나누어떨어지는 년도는 윤년 )

 

 - 코드

import java.util.Scanner;

public class Test02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int str = 0;
		
		System.out.println("연도 입력 : ");
		str = sc.nextInt();
		
		if((str%100==0)&&(str%400==0)&&(str%4==0)) {
			System.out.println("윤년입니다");
		} else
			System.out.println("운년이 아닙니다");
		
	}

}

 

3. 주민등록번호 8번째 자리를 입력받아 출생지를 알아보는 프로그램( 각 번호는 인터넷에서 검색 )

 

 - 코드 

import java.util.Scanner;

public class Test03 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int num=0;
		System.out.println("주민번호 8째 자리 입력 : ");
		num = sc.nextInt();
		
		if(num>=0&num<=8) 
			System.out.println("서울 출생");
		else if(num>=9&num<=12) 
			System.out.println("부산 출생");
		else if(num>=13&num<=15) 
			System.out.println("인천 출생");
		else if(num>=16&num<=25) 
			System.out.println("경기 출생");
		else if(num>=26&num<=34) 
			System.out.println("강원 출생");
		else if(num>=35&num<=39) 
			System.out.println("충북 출생");
		else if(num==40) 
			System.out.println("대전 출생");
		else if(num>=41&num<=47) 
			System.out.println("충남 출생");
		else if(num==44|num==96) 
			System.out.println("세종 출생");
		else if(num>=48&num<=54) 
			System.out.println("전북 출생");
		else if(num>=55&num<=64) 
			System.out.println("전남 출생");
		else if(num>=65&num<=66) 
			System.out.println("광주 출생");
		else if((num>=67&num<=69)|num==76) 
			System.out.println("대구 출생");
		else if((num>=70&num<=75)|(num>=77&num<=81)) 
			System.out.println("경북 출생");
		else if((num>=82&num<=84)|(num>=86&num<=93)) 
			System.out.println("경남 출생");
		else if(num==85)
			System.out.println("울산 출생");
		else if(num>=94&num<=95)
			System.out.println("제주 출생");

	}

}

 

4. 구구단을 출력하는 프로그램

 

 - 코드

import java.util.Scanner;

public class Test04 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = 0;
		
		System.out.println("단수 : ");
		num = sc.nextInt();

		for(int i=1;i<=9;i++) {
			System.out.println(num+" * "+i+" = "+(num*i));
		}
		System.out.println("===="+num+"단====");
		
	}

}

 

5. 계산기 프로그램을 만들어서 계산을 수행한 후 다시 계산을 할 것인지 물어보는 프로그램

 

 - 코드

import java.util.Scanner;

public class Test05 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = 0;
		int num2 = 0;
		String str = "";
		String anw = "";
		
		do {
			System.out.print("첫번째 수 : ");
			num = sc.nextInt();
			System.out.print("연산자(+, -, /, %, *) : ");
			str = sc.next();
			System.out.print("두번째 수 : ");
			num2 = sc.nextInt();
			
			if(str.equals("+"))
				System.out.println(num+" "+str+" "+num2+" = "+(num+num2));
			else if(str.equals("-"))
				System.out.println(num+" "+str+" "+num2+" = "+(num-num2));
			else if(str.equals("*"))
				System.out.println(num+" "+str+" "+num2+" = "+(num*num2));
			else if(str.equals("/"))
				System.out.println(num+" "+str+" "+num2+" = "+(num/num2));
			else if(str.equals("%"))
				System.out.println(num+" "+str+" "+num2+" = "+(num%num2));
			
			System.out.print("계속하시겠습니까?(y/n) : ");
			anw = sc.next();
			
			System.out.println();
			System.out.println();
		}while(anw.equals("y"));

	}

}

 

 

6. 연도와 월을 입력받아 달력을 출력하는 프로그램, 윤년도 확인해야 하고 요일도 나타나야 합니다.

 

 - 코드

import java.util.Calendar;
import java.util.Scanner;

public class Test06 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num1=0;
		int num2=0;
		
		System.out.print("년도를 4자리까지 입력(예 - 2004) : ");
		num1 = sc.nextInt();
		System.err.print("월 입력(예 - 6) : ");
		num2 = sc.nextInt();
		
		Calendar start = Calendar.getInstance();
		Calendar end = Calendar.getInstance();

		// 월은 시스템에서 0을 1로 인식, -1 필요
		start.set(num1, num2-1, 1);
		// getActualMaximum 함수는 해당 날짜의 가장 큰 숫자를 리턴
		end.set(num1, num2-1, start.getActualMaximum(Calendar.DATE));
		
		
		// week_day는 시작날짜의 요일, 몇번째 날인지 지정
		// DAY_OF_WEEK은 숫자로 1이면 월요일부터 7이면 일요일까지 리턴
		int week_day = start.get(Calendar.DAY_OF_WEEK);
		// day는 해당 날짜 
		int day = end.get(Calendar.DATE);
		
		System.out.println("\t"+num1+" 년"+num2+" 월");
		System.out.println("  일   월   화   수   목   금   토");
		System.out.println("-----------------------");
		
		for(int i=1; i<week_day; i++) {
			System.out.print("   ");
		}
		
		for(int i=1, w=week_day; i<=day; i++, w++) {
			System.out.print(i>=10?" "+i:"  "+i);
			
			if(w%7==0) 
				System.out.println();
		}
		
	}

}

 위의 코드는 아래의 주소에서 참조를 했습니다.

http://blog.naver.com/PostView.nhn?blogId=slrkanjsepdi&logNo=90160701047

 

[java] 간단한 달력 프로그램. (Calendar프로그램)

Java로 이용해서 사용자로부터 년과 월을 입력받고 달력의 형태로 표시해주는 방법을 알아보겠다. 달력을 ...

blog.naver.com

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 메서드 - 문제  (0) 2019.04.22
자바 메서드 ( method )  (0) 2019.04.21
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16

1. for

 for 문의 핵심내용은 반복한다는 것입니다. 만약 같은 변수나 문자를 여러번 출력해야 하는데 for문을 사용하지 않으면 System.out.println();을 출력하고자 하는 만큼 코딩해야 할 것입니다. 하지만 for문을 이용하면 매우 간단하게 줄일 수 있습니다. 아래의 형식을 보도록 하겠습니다.

 

 - for ( 초기화; 조건; 증감 ) {

      내용;

   }

 

 위의 초기화 부분에서는 주로 for문에서 사용될 변수의 초기화가 이루어집니다. 이어서 조건에서는 if문에서와 같이 조건이 작동합니다. 이후 증감부분에서는 초기화에 사용되었던 변수의 증감이 이루어지게 됩니다. 하지만 이러한 초기화, 조건, 증감의 부분에서는 꼭 필요한 것은 아닙니다. 각 영역은 공백이 될 수도 있습니다. 아래에서 특징을 살펴보도록 하겠습니다.

 

 - 초기화 : 공백 가능, 변수 선언과 동시에 초기화 가능( int i = 0 ), 이미 선언된 변수라면 초기화 작업만 가능

 - 조건 : 공백 가능, 논리형 조건 사용 가능

 - 증감 : 공백 가능, 증감 연산자의 사용 가능( x++, ++x ), 수식 사용 가능( x += y )

 

 위처럼 각 영역은 공백이 가능하기도 하고 굳이 정수형이 아닌 String형도 가능하기도 합니다. 그렇다면 이번에는 for문의 실행과정에 대해 알아보도록 하겠습니다.

 

 - for ( ① ; ② ; ④ ) {
      ③;

   } 

 

 이렇게 숫자의 순서대로 작동하게 됩니다. 우선 초기화 부분을 거쳐 초기화가 이뤄지고 난 후 조건에 들어가서 해당 조건이 참인지 거짓인지를 판별합니다. 이후 해당 조건이 참이라면 3번의 내용 부분으로 가서 내용을 수행한 후 증감인 4번으로 가서 증감을 수행하게 됩니다. 이러한 과정을 반복하며 2번에서 조건이 거짓이 나올때까지 반복하게 됩니다. 하지만 이때 1번인 초기화 부분은 처음에만 실행되며 한바퀴를 돌고 난 후에는 작동하지 않습니다.

 

 이번에는 삼각형을 출력하는 코드를 살펴보도록 하겠습니다.

public class Triangle {

	public static void main(String[] args) {
		
		int i=0,j=0;
		
		for(i=0;i<5;i++) {
			for(j=0;j<=i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

	}
}

 이 코드는 프로그래밍을 처음 배울 때 쉽게 접하는 삼각형을 출력하는 코드입니다. 이 코드를 살펴보면 for문이 2개가 중첩돼있는 것을 알 수 있습니다. 이는 삼각형을 한줄한줄 순차적으로 표시하기 때문에 이렇게 작성하게 되는 것입니다. 그렇다면 이번에는 좀 다른 코드를 살펴보도록 하겠습니다.

public class ABCD {

	public static void main(String[] args) {
		
		for(char i='A'; i<='Z'; i++) {
			System.out.print(i);
		}
	}

}

 위의 코드는 알파벳을 A부터 Z까지 일렬로 출력하는 프로그램입니다. 이처럼 for문의 초기화, 조건 부분에는 꼭 숫자가 아닌 문자가 와도 상관없습니다.

 

2. while

 while문은 for문과 비슷한 개념의 반복문이지만 while문에는 초기화와 증감이 존재하지 않습니다. 우선 아래의 형식을 보도록 하겠습니다.

 

 - while( 조건 ){
      내용;

   }

 

 위의 while문의 조건에는 논리형 조건식과 수치형 조건식 모두 사용이 가능합니다. 또 C언어에서는 while(1)이 가능했지만 자바에서는 이를 허용하지 않기 때문에 while(true)와 같이 true혹은 false로 대입해주어야 합니다.

 

3. do ~ while

 do~while은 while과 거의 흡사합니다. 하지만 차이점은 이 do~while문은 안의 내용을 우선 한번 실행하고 난 후 조건을 따지게 되지만 while문은 조건을 우선적으로 따져서 조건이 거짓이라면 안의 내용부를 실행조차 하지 않게 됩니다. 그렇다면 이 do~while문의 예제를 보도록 하겠습니다.

import java.io.*;

public class Round06_Ex07 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int kor = 0, eng = 0, mat = 0, tot = 0;
		char point = 0;
		float ave = 0.0f;
		
		do {
			System.out.print("국어 = ");
			kor = Integer.parseInt(in.readLine());
		} while(kor < 0 || kor > 100);
		
		do {
			System.out.print("영어 = ");
			eng = Integer.parseInt(in.readLine());
		} while(eng < 0 || eng > 100);
		
		do {
			System.out.print("수학 = ");
			mat = Integer.parseInt(in.readLine());
		} while(mat < 0 || mat > 100);
		
		tot = kor + eng + mat;
		ave = tot/3.0f;
		
		switch((int)(ave/10)) {
		case 10:
		case 9 : point = 'A'; break;
		case 8 : point = 'B'; break;
		case 7 : point = 'C'; break;
		case 6 : point = 'D'; break;
		default : point = 'F';
		}
		
		System.out.println();
		System.out.println("총점 = "+tot);
		System.out.printf("평균 = %.2f\n", ave);
		System.out.println("학점 = "+point+"학점");

	}

}

 위의 코드는 각 영역의 점수를 입력받아 총점과 평균을 계산하고 그에 따른 학점을 계산하는 프로그램입니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 2  (0) 2019.04.15

 제어문이라는 것은 모든 프로그래밍 언어에서 사용되는 것으로 쉽게 말해 일련의 조건을 주어 프로그램의 동작을 제어하는 것이라고 볼 수 있습니다. 그렇다면 이 제어문에 대해 자세히 알아보도록 하겠습니다.

 

1. if

 if라는 것의 영어적 의미는 '만약 ~라면'이라는 뜻으로 보통 가정을 세울 때 사용합니다. 이는 프로그래밍에서도 마찬가지로 괄호 안의 내용이 참이면 아래의 조건을 실행하라는 의미로 사용됩니다. 형식은 아래와 같이 사용할 수 있습니다.

 

 - if( 조건1 ){

      내용;

   } else if( 조건2 ){

      내용;

   } else

      내용;

 

 위의 형식에서 만약에 조건1에서 false값이 나온다면 조건2로 넘어가게 될 것입니다. 조건2도 false값이 나온다면 마지막 디폴트인 else 부분으로 넘어가게 될 것입니다. 이처럼 'if'와 'else if'를 함께 사용하는 것은 만약 위의 조건이 거짓이라면 아래의 조건으로 넘어가라는 의미가 됩니다. 그렇다면 아래를 보도록 하겠습니다.

 

 - if( 조건1 ) {

      내용;

   }

 

   if( 조건2) {

      내용;

   }

 

 프로그래밍이 처음인 사람들은 위와 같은 실수를 종종 일으키곤 합니다. 위의 형식은 앞서 배웠던 'if-else if' 형식과는 다른 형식입니다. 이는 if문이 2개인 것이므로 조건1에서 true 값이 나온다고 해서 조건2를 수행하지 않는 것이 아닌 것이 됩니다.

 

 또한 C에서는 if문에서 괄호 사이에 0혹은 1을 넣어도 잘 작동했던 경험이 있을 것입니다. 하지만 자바에서는 숫자를 논리형 조건식으로 인식하지 않기 때문에 'true'혹은 'false'를 넣어주어야 합니다. ( true = 무조건 실행, false = 무조건 생략 )

 

2. if 문의 예제

 이번에는 if 문의 예제로서 2개의 수를 입력받아 더 큰 수를 출력하는 프로그램을 작성해보도록 하겠습니다.

import java.io.*;

public class Round06_Ex01 {

	public static void main(String[] args) throws IOException {
	
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int first = 0, second = 0;
		System.out.println("첫번째 수 : ");
		first = Integer.parseInt(in.readLine());
		
		System.out.println("두번째 수 : ");
		second = Integer.parseInt(in.readLine());
		
		if(first > second) {
			System.out.println("첫번째 수("+first+")");
			System.out.println("가 두번째 수("+second+")");
			System.out.println("보다 큽니다");
		} else {
			System.out.println("첫번째 수("+first+")");
			System.out.println("가 두번째 수("+second+")");
			System.out.println("보다 작습니다");
		}

	}

}

 위의 코드는 간단한 코드이므로 별다른 설명은 필요하지 않을 것 같습니다. 그렇다면 이번에는 3개의 수를 입력받아 내림차순으로 정렬하는 코드를 작성해보도록 하겠습니다.

import java.io.*;

public class Round06_Ex02 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int first = 0, second = 0, third = 0;
		int tmp = 0;
		
		System.out.println("첫번째 수 : ");
		first = Integer.parseInt(in.readLine());
		System.out.println("두번째 수 : ");
		second = Integer.parseInt(in.readLine());
		System.out.println("세번째 수 : ");
		third = Integer.parseInt(in.readLine());
		
		if(second >= first && second >= third) {
			tmp = first;
			first = second;
			second = tmp; 
		} else if(third >= first && third >= second) {
			tmp = first;
			first = third;
			third = tmp;
		} 
		
		if(third >= second) {
			tmp = second;
			second = third;
			third = tmp;
		} 
		
		System.out.println();
		System.out.println(first + " >= " + second + " >= " + third);

	}

}

 위의 코드에서 자세히 볼 부분은 first 변수와 second 변수의 값을 서로 바꾸는 방식입니다. 저렇게 임시 변수를 생성하지 않고 바로 first = second, second = first로 바꾸면 되지 않냐는 생각을 할 수 있는데 만약 이렇게 한다면 first에 second의 값이 들어간 후 second에 first의 값을 넣으려 할 때에는 first에 이미 second 값이 들어있으므로 second = second인 셈이 되는 것입니다. 때문에 임시 변수를 생성하여 원래 있던 값을 따로 저장해놓은 후 하나의 값을 바꾼 후 다른 변수에 임시 변수의 값을 넣어주는 것입니다.

 

3. switch ~ case ~ break

 if 문은 위에서부터 모든 조건을 수행해보고 참과 거짓을 가려야 하기 때문에 값이 true인 조건을 찾을 때까지의 시간이 다소 오래 걸릴 수 있습니다. 이렇게 시간이 늘어날수록 속도는 현저히 느려지기 때문에 이를 대체하기 위해 switch ~ case 라는 것이 나왔습니다. 이 switch-case문은 조건을 하나씩 비교하는 것이 아닌 말 그대로 여러 케이스 중 조건과 맞는 케이스를 찾아 바로 실행하는 방식입니다. 형식은 아래와 같이 사용할 수 있습니다.

 

 - switch( ) { // 괄호 안에는 byte, short, int, char 자료형의 값( 굳이 변수나 숫자가 아니어도 상관 X )

   case 값1 : 내용; break; // 내용은 굳이 하나가 아닌 '내용; 내용;' 식으로 여러 내용을 사용 가능

   case 값2 : 내용; break;

   case 값n : 내용; break;

   default : 내용; // 어떠한 case에도 조건이 맞지 않을 경우 자동실행

   }

 

 switch-case에서 조심해야 할 점은 특별한 경우가 아닌이상 각 case에는 break;를 작성해주어야 한다는 것입니다. 만약 이 break;를 써주지 않으면 조건에 맞는 case의 내용을 실행하고 이후에 멈추지 않고 계속해서내려가면서 아래의 case를 실행하게 될 것입니다. 결론적으로는 원하는 case만을 실행하는 것이 아닌 조건에 맞는 case부터 break;를 만날 때까지 모든 case의 내용이 실행된다는 것입니다. 반대로 이러한 점을 응용하는 것도 가능합니다. 만약 여러 개의 case에 해당하지만 하나의 내용으로 묶고 싶을 때는 아래와 같이 사용할 수 있습니다.

 

 - switch( ){

   case n : case n-1 : 내용; break;

   default : 내용;

 }

 

 만약 위와 같이 코딩을 하게 되면 switch문에서 괄호에 n이 들어가든 n-1이 들어가든 같은 내용이 실행될 것입니다.

 

4. switch ~ case ~ break 의 예제

 이번에는 주민등록번호 뒷자리 7개 중 첫번째 자리를 입력받아 태어난 연도와 성별을 출력하는 프로그램을 작성해보도록 하겠습니다.

import java.io.*;

public class Round06_Ex03 {

	public static void main(String[] args) throws IOException {
		
		System.out.println("주민번호 7번째 자리");
		int x = System.in.read()-48;
		int year = 0;
		String sex = "";
		
		switch(x) {
		case 9 : case 0 : year = 1800; break;
		case 1 : case 2 : year = 1900; break;
		case 3 : case 4 : year = 2000; break;
		default : System.out.println("잘못 입력");
		}
		
		sex = x%2 == 0 ? "여성" : "남성";
		
		System.out.print("당신의 나이는" + year + "년대생");
		System.out.println(sex + "입니다");

	}

}

 위의 코드를 살펴보면 앞서 언급했던 여러 개의 case를 하나의 내용으로 묶는 방법이 사용되었습니다. 그렇다면 또 다른 코드를 작성해보도록 하겠습니다.

import java.io.*;

public class Round06_Ex04 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int num1 = 0, num2 = 0, tot = 0;
		char ch = 0;
		
		System.out.println("첫번째 수 : ");
		num1 = Integer.parseInt(in.readLine());
		System.out.println("연산자(+, -, *, /, %) : ");
		ch = (char)System.in.read();
		System.in.read();
		System.in.read();
		System.out.println("두번째 수 : ");
		num2 = Integer.parseInt(in.readLine());
		
		switch(ch) {
		case '+' : tot = num1 + num2; break;
		case '-' : tot = num1 - num2; break;
		case '*' : tot = num1 * num2; break;
		case '/' : tot = num1 / num2; break;
		case '%' : tot = num1 % num2; break;
		default : System.out.println("잘못된 연산자");
		}
		
		System.out.println();
		System.out.println(num1 + " " + num2 + " = " + tot);

	}

}

 이 코드는 두 수와 연산자를 입력받아서 계산을 수행하는 프로그램입니다. 이번에도 별다른 내용은 없으므로 넘어가도록 하겠습니다.

 

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 2  (0) 2019.04.15
자바 연산자 - 1  (0) 2019.04.14

1. 숫자 하나를 입력받아 그 수가 1이면 "남성", 2이면 "여성"을 출력하는 프로그램

 

 - 해답

import java.util.Scanner;

public class Test3 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int i = sc.nextInt();
		
		System.out.println(i==1?"남성":"여성");

	}

}

 

2. 문자 하나를 입력받아 그 문자가 산술 연산자인지 아닌지를 판단하는 프로그램

 

 - 해답

import java.io.*;
import java.util.Scanner;

public class Test4 {

	public static void main(String[] args) throws IOException {
		
		Scanner in = new Scanner(System.in);
		String str = "";
		
		System.out.println("산술 연산자 입력(+, -, *, /, %) : ");
		str = in.nextLine();
		
		if("+".equals(str))
			System.out.println("산술 연산자임");
		else if("-".equals(str))
			System.out.println("산술 연산자임");
		else if("*".equals(str))
			System.out.println("산술 연산자임");
		else if("/".equals(str))
			System.out.println("산술 연산자임");
		else if("%".equals(str))
			System.out.println("산술 연산자임");
		else
			System.out.println("산술 연산자가 아님");
		
	}

}

 

 이번 문제풀이에서는 BufferedReader 대신에 Scanner라는 입력클래스를 사용하였습니다. 이유는 BufferedReader보다 훨씬 간편하고 사용하기도 편리하기 때문입니다. 

 

 문제 2번에서 if문은 아직 포스팅하지는 않았지만 저걸 사용하지 않으면 도저히 풀 방법이 없는 것 같아서 사용하였고 if문에 "+".equals(str)과 같이 산술 연산자를 사용하지 않은 이유는 if(str == "+")과 같이 코드를 작성하면 오류가 발생하여 해결되지 않아 저렇게 대체하였습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 2  (0) 2019.04.15
자바 연산자 - 1  (0) 2019.04.14
자바 기본 입출력 - 문제  (0) 2019.04.11

6. 관계 연산자

 관계 연산자는 일상의 수학에서 부등호 역할을 한다고 볼 수 있습니다. 왼쪽과 오른쪽의 대소를 구분하여 참과 거짓을 반환하는 형태입니다. 결과값은 true 혹은 false로 나타내기 때문에 논리형에서 사용할 수 있습니다. 관계 연산자는 비교 관계 연산자와 항등 관계 연산자로 구분할 수 있습니다.

 

 1] 비교 관계 연산자 ( <, >, <=, >= )

  비교 관계 연산자는 초과, 이상, 미만, 이하를 나타내는데 사용합니다.

 

  - int a = 10;

    int b = 11;

    boolean bool = a < b;   // bool의 값은 true

 

 2] 항등 관계 연산자 ( ==, != )

  항등 관계 연산자는 왼쪽과 오른쪽의 두 값이 같은지 아닌지를 판단할 때 사용합니다. '=='은 두 값이 같다는 의미이고 '!='은 두 값이 다르다는 의미입니다. 각 연산자의 결과값은 참이면 true를, 거짓이면 false를 반환합니다.

 

  - int a = 10;

    int b = 11;

    boolean bool = a == b;   // bool의 값은 false

 

7. 비트 연산자

 비트 연산자는 앞서 설명했던 쉬프트 연산자와는 약간의 차이점이 있습니다. 쉬프트 연산자의 경우에는 비트로 변환 후 일정 값 만큼 이동시키지만 비트 연산자는 비트로 변환 후 서로 일치하는 비트의 수를 계산하는 연산자입니다. 

 

 1] AND 연산자 ( & )

  이 AND 연산자는 두 피연산자의 비트 값이 모두 1일 때 결과값을 1로 반환하고 나머지는 0으로 반환합니다.

 

  - int a = 3;

    int b = 5;

    int c = a & b;

 

    0000 0000 0000 0000 0000 0000 0000 0011     // 10진수 3

    0000 0000 0000 0000 0000 0000 0000 0101     // 10진수 5

    -------------------------------------------------- AND 연산

    0000 0000 0000 0000 0000 0000 0000 0001     // 10진수 1

 

 2] Exclusive OR 연산자 ( ^ )

  이 연산자는 & 연산자와 반대로 두 피연산자의 비트 값이 서로 다를 때 1을 반환하고 같으면 0을 반환합니다.

 

  - int a = 3;

    int b = 5;

    int c = a & b;

 

    0000 0000 0000 0000 0000 0000 0000 0011     // 10진수 3

    0000 0000 0000 0000 0000 0000 0000 0101     // 10진수 5

    -------------------------------------------------- ^ 연산

    0000 0000 0000 0000 0000 0000 0000 0110     // 10진수로 6

 

 3] OR 연산자 ( | )   ※ 보통 엔터 키 위의 역슬래쉬를 Shift 키와 같이 누르면 나오는 기호

  이 연산자는 두 피연산자의 비트 값이 모두 0이면 0을 반환하고 하나라도 1이면 1을 반환합니다.

 

  - int a = 3;

    int b = 5;

    int c = a & b;

 

    0000 0000 0000 0000 0000 0000 0000 0011     // 10진수 3

    0000 0000 0000 0000 0000 0000 0000 0101     // 10진수 5

    -------------------------------------------------- ^ 연산

    0000 0000 0000 0000 0000 0000 0000 0111     // 10진수로 7

 

8. 논리 연산자

 논리 연산자는 앞에서 나왔던 것도 몇가지 있습니다. 서로 비슷하게 생긴 모양들도 있지만 각자의 역할이 다르므로 주의가 필요합니다.

 

 1] &와 &&연산자

  위 연산자들은 두 피연산자 모두 true값을 가지면 결과가 true가 됩니다. 하지만 실행에 있어서는 약간의 차이가 있습니다. &&는 &와 그 역할은 비슷하지만 두 피연산자의 값을 모두 비교하지 않는다는 다른 점이 있습니다. 아래의 예시를 보도록 하겠습니다.

 

  - int a = 10;

    int b = 20;

    boolean bool = ++x > y && x < ++y; 

 

 위의 코드를 실행해보면 bool에는 false 값이 들어가는 것을 확인할 수 있습니다. 하지만 y의 값은 그대로 20인 것을 알 수 있습니다. 이는 && 연산이후 x < ++y 부분에서 y에 증감 연산자가 작동하지 않았다는 뜻이 됩니다. 이를 통해 알 수 있는 것은 && 연산자는 두 피연산자를 모두 비교하는 것이 아닌 앞에서 false라고 판단이 되면 뒤의 연산은 자동으로 수행하지 않는다는 것을 알 수 있습니다.

 

 2] |와 ||연산자

  위 연산자들은 아까와는 반대로 두 피연산자 모두 false의 값을 가지면 false값을 출력하게 됩니다. ||연산자 또한 |와 같은 역할을 하지만 앞쪽 피연산자의 연산만으로 전체 결과의 판단이 가능하다고 판단되면 뒤의 연산은 수행하지 않습니다. 아래의 코드를 보도록 하겠습니다. 

 

 우선 |연산자부터 살펴보도록 하겠습니다.

public class Round05_Ex05 {
	
	public static boolean aaa() {
		System.out.println("AAA");
		return true;
	}
	
	public static boolean bbb() {
		System.out.println("BBB");
		return false;
	}

	public static void main(String[] args) {
		
		boolean b = aaa()|bbb();
		System.out.println("b = "+b);

	}

}

 위의 코드를 실행하면 aaa함수와 bbb함수가 모두 실행되어 'AAA', 'BBB' 모두 출력되고 이후에 true라는 값이 출력되는 것을 알 수 있습니다. 이번에는 반대로 아래의 코드를 살펴보도록 하겠습니다.

public class Round05_Ex04 {
	
	public static boolean aaa() {
		System.out.println("AAA");
		return true;
	}
	
	public static boolean bbb() {
		System.out.println("BBB");
		return false;
	}

	public static void main(String[] args) {
		
		boolean b = aaa()||bbb();
		System.out.println("b = "+b);

	}

}

 위의 코드는 아까와는 반대로 'AAA'만 출력되고 true라는 값이 출력되는 것을 확인할 수 있습니다.

 

9. 삼항 연산자

 삼항 연산자는 3개의 항으로 이루어져 있기 때문에 붙여진 이름입니다. 구조는 아래와 같습니다.

 

  - 조건항 ? 항1 : 항2

 

 삼항 연산자는 조건항에서 연산을 수행 후 참이라면 항1의 연산을, 거짓이라면 항2의 연산을 수행하게 됩니다. 아래의 예시를 보도록 하겠습니다.

 

  - int a = 10;

    int b = 20;

    int c = a < b ? a : b;

 

 위의 코드의 결과는 a가 b보다 작기 때문에 c 변수에는 a의 값이 들어가게 됩니다. 하지만 C언어와 비슷하기 때문에 쉽게 발생하는 오류가 있습니다. 만약 아래와 같이 코딩을 하게 된다면 오류가 발생할 것입니다.

 

  - int a = 10;

    a == 10? System.out.println("참") : System.out.println("거짓");

 

 자바에서는 이러한 문법을 허용하지 않기 때문에 아래와 같이 고쳐주어야 합니다.

 

  - int a = 10;

    System.out.println(a == 10 ? "참" : "거짓");

 

 이처럼 동일한 문장을 반복하는 것이 아닌 하나의 문장 안에 전달할 매게변수에서 연산을 수행하여야 합니다.

 

10. 배정 대입 연산자

  배정 대입 연산자는 대입 연산자와 다른 연산자들을 결합한 형태라고 볼 수 있습니다. 때문에 두 가지 연산자의 역할을 모두 수행합니다. 아래의 예시를 보도록 하겠습니다.

 

  - int a = 10;

    int b = 0;

    int b = a -= ++b;

 

 위의 코드는 변수 b에 a에서 b에 1을 더한 값을 빼고 저장하라는 의미가 됩니다. 이를 자세하게 풀어쓰면 아래와 같이 나타낼 수 있습니다.

 

  - int b = ( a = a - (++b));   // 연산 결과는 a=9, b=9

'프로그래밍 > JAVA' 카테고리의 다른 글

제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 1  (0) 2019.04.14
자바 기본 입출력 - 문제  (0) 2019.04.11
자바 기본 입출력  (0) 2019.04.10

1. 연산자의 우선순위

 우선순위를 알기에 앞서 연산자의 역할은 무엇이고 어떠한 것들이 있는지 알아보도록 하겠습니다. 연산자라는 것은 쉽게 말해 연산을 수행하는 기호입니다. 대표적인 사칙연산을 포함하여 컴퓨터 연산에서만 사용하는 비트 연산자(쉬프트 연산자), 상함 연산자 등이 있습니다. 그렇다면 자세하게 어떤 연산자들이 있는지 알아보도록 하겠습니다.

 

 - 최우선 연산자 : '.', [], ()

 - 단항 연산자 : !, ~, +, -, ++, --, (cast)

 - 산술 연산자 : +, -, *, /, %

 - 시프트 연산자 : <<, >>, >>>

 - 관계 연산자(비교, 항등) : >, <, >=, <=, ==, !=

 - 비트 연산자 : &, |, &&, ||

 - 삼항 연산자 : 조건항?항1:항2

 - 배정 대입 연산자 : =, +=, -=, *=, /=, %=, <<=, >>=, ^=, &=, |=

 - 후위형 증감 연산자 : ++, --

 - 순차 연산자 : ','

 

 위와 같은 연산자들이 있습니다. 우선순위는 위에서부터 아래로의 순서입니다. ( 최우선 연산자->후위형 ) 그렇다면 이제 각 연산자들이 어떠한 역할을 하는지 알아보도록 하겠습니다.

 

2. 최우선 연산자

 최우선 연산자는 말 그대로 가장 우선적으로 처리하는 연산자입니다. 우선 첫번째인 점('.')을 알아보도록 하겠습니다. 정확한 이름은 참조 연산자로써 각 클래스 내에서 사용하는 멤버나 또 다른 클래스를 참조하기 위해 사용합니다. 예시는 아래와 같습니다.

 

 - System.out.println(); // 이 문장에서 '.'은 모두 참조연산자

 

 이러한 형태는 코드를 작성할 때에나 시작할때 'import java.io.*;'과 같이 패키지를 참조할 때 많이 볼 수 있습니다. 그럼 다음으로 '[]'으로 넘어가도록 하겠습니다. 이 기호는 별다른 이름은 없습니다. 속칭 대괄호라고 할 수 있는 이 기호는 자료형이나 클래스와 함께 사용되며 해당 변수나 객체가 배열로 선언됨을 알리는 역할을 합니다. 하지만 이 사이에 숫자가 들어가 있다면 단순히 배열 안에서의 인덱스를 가리키게 됩니다.

 

 - String[] str = {"JAVA", "ASDF"};

   System.out.println(str[0]);  // 출력 결과는 'JAVA'

 

 위에서 첫줄은 str이라는 변수가 String형으로 선언된 배열임을 나타내지만 아래에서는 str배열의 0번째 요소를 가리키게 됩니다. 이제 마지막으로 ()을 알아보도록 하겠습니다. 속칭 소괄호는 특정 연산자들을 우선적으로 처리하도록 지시하는 역할을 합니다. 쉽게말해 일반적으로 사용되는 수학에서 같은 역할을 한다고 보시면 됩니다.

 

 - int x = 3*1+2;

   int y = 3*(1+2);   // '1+2'를 먼저 실행 후 '*3' 을 실행

 

3. 단항 연산자

 단항 연산자는 하나의 항을 연산하는 연산자를 말합니다. 그렇다면 각 단항 연산자들은 어떠한 역할을 하는지 알아보도록 하겠습니다. 우선 '!'에 대해서 알아보도록 하겠습니다. 다른 언어들과 마찬가지로 이 기호는 부정하는 역할을 수행합니다. 예시를 보도록 하겠습니다.

 

 - boolean bool = false;

   boolean bool2 = !bool;

 

 위와 같이 코드를 작성한다면 bool에는 false값이, bool2에는 bool의 반대 값인 true가 저장 될 것입니다. 이 부정을 의미하는 '!'는 논리형 자료형이 아닌 정수형, 실수형과 같은 다른 자료형에서 사용하게 되면 에러가 발생합니다. 다음으로 비트를 부정하는 '~'연산자에 대해 알아보겠습니다. 이 연산자는 비트 값으로 저장되는 모든 값에 대해 부정의 값을 취할 수 있습니다. 이 자료형은 몇 가지의 특징이 있는데 boolean, float, double의 자료형들은 이 연산자를 사용할 수 없습니다. 그리고 byte, char, short, int형의 자료형들은 이 연산자를 사용하면 결과값을 int형이나 long형의 자료형에만 저장이 가능하고 long형의 결과값은 long형의 자료형에만 저장이 가능하다는 특징이 있습니다.

 

 - boolean a = false;   // ~a -> X 

   float f = 12.34f;   // ~f -> X

   double d = 12.34;   // ~d -> X

 

   byte b = 12;  // byte c = ~b; -> X, int c = ~b; -> O

   long b = 12L;   // int c = ~b; -> X, long c = ~b; -> O

 

 '~'연산자의 연산 과정은 이러합니다. 모든 자료형은 우선 int형의 비트인 32비트로 변환, long형의 경우 64비트로 변환되어 연산이 수행됩니다. 그리고 이러한 과정의 공식은 아래와 같습니다.

 

 - 피연산자 비트 * (-1) -1;

 

 사칙연산자는 초등학교 때 배우는 것이므로 건너뛰도록 하겠습니다. 이후 +와 -를 2개씩 붙인 증감 연산자( ++/ -- )에 대해 알아보도록 하겠습니다. 이 연산자의 역할은 특정한 값에 1을 더하거나 빼주는 역할을 합니다. 이 연산자의 특징으로는 피연산자의 앞에 쓰이는지 뒤에 쓰이는지에 따라 다른 값을 출력한다는 것입니다. 앞에 붙게되면 연산의 우선순위가 높아 다른 연산자들에 비해 우선적으로 처리되게 됩니다. 하지만 뒤에 붙게 된다면 우선순위가 낮게 되어 다른 모든 연산이 된 후에 연산될 것입니다. 아래의 소스를 예시로 보겠습니다.

public class Round05_Ex01 {

	public static void main(String[] args) {
		
		int x = 5;
		int y = ++x;
		System.out.println("x = "+x);
		System.out.println("y = "+y);

	}

}

  위의 코드를 실행시켜보면 둘 다 값이 6으로 나오는 것을 확인할 수 있습니다. 이는 x가 5로 선언이 되었지만 y에 값을 저장하면서 전위 연산자인 ++을 통해 x의 값에 1이 우선적으로 더해지고 y에 그 1이 더해진 x의 값이 저장되면서 둘 다 6이 되었기 때문에 둘 모두 6으로 출력될 수 있는 것입니다. 그럼 반대로 아래의 소스를 보도록 하겠습니다.

public class Round05_Ex02 {

	public static void main(String[] args) {
		
		int x = 5;
		int y = x++;
		System.out.println("x = "+x);
		System.out.println("y = "+y);

	}

}

 이 코드를 실행하게 되면 아까와는 다른 6과 5가 각자 출력이 될 것입니다. 이는 아까와 과정은 비슷하지만 y에 값을 저장하는 과정에서 x에 1이 더해진 값이 저장되는 것이 아닌 1이 더해지기 전의 값(5)가 저장이 되고 1이 더해지기 때문에 6과 5가 출력되는 결과를 얻을 수 있습니다. 이번에는 하나의 연산자가 아닌 다른 연산자들도 같이 있는 경우를 보도록 하겠습니다.

 

 - int a = 10;

   3+ ++a * 10   // 이 경우에는 3 + 11 * 10이 되므로 113이 됩니다.

 

 - int a = 10;

   3+ a++ * 10   // 이 경우에는 3 + 10 * 10이 되므로 103이 됩니다. 하지만 x의 값은 동일하게 11이 됩니다.

 

 이번에는 형변환인 '(cast)'에 대해서 알아보도록 하겠습니다. 'cast'의 정확한 이름은 'Casting'으로 자동 형변환을 'Up Casting', 강제 형변환을 'Down Casting'이라고 합니다. 이 캐스팅은 별다른 의미가 없으므로 우선순위가 꽤 높다는 것만 알아두고 넘어가도록 하겠습니다.

 

4. 산술 연산자

 산술 연산자는 초등학교에서 배우는 사칙연산이라고 볼 수 있습니다. 따라서 개념에 있어서 어려운 부분은 없으나 주의할 점이 있습니다. 자료형에 따라서 우선순위가 다르다는 것입니다. 우선 정수형 자료형을 보도록 하겠습니다. 정수형 자료형에서의 산술 연산자는 byte, short, char, int형 사이에서의 결과가 int 자료형이 된다는 것입니다. 아래의 예시를 보도록 하겠습니다.

 

 - byte b = 10;

   short s = 20;

   b + s = 30 ( int형의 결과 )

 

 이번에는 실수형 자료형들의 연산에 대해 알아보도록 하겠습니다. long, float, double 자료형이 연산에 개입되면 큰 자료형의 결과를 나타내게 됩니다. ( long < float < double )

 

 - 50 + 2L * 3;   // long형 결과 56

   1.2f + 50L - 12;   // float형 결과 39.2

 

 이때 주의할 점은 float과 double 사이에서의 연산을 혼용하면 안된다는 것입니다. 이는 정밀도의 차이 때문에 그런것인데 아래의 코드를 살펴보도록 하겠습니다.

public class Round05_Ex03 {

	public static void main(String[] args) {
		
		float f = 1.2f;
		double d = 1.2;
		double dd = d-f;
		System.out.println(dd);

	}

}

 위의 코드를 실행해보면 0이 아닌 다른 값이 출력되는 것을 확인할 수 있습니다. 때문에 float형과 double형의 혼용 연산은 멀리하는 것이 좋습니다.

 

5. 쉬프트 연산자 

 쉬프트 연산자는 피연산자의 값을 2진 비트로 계산한 후 특정 비트 만큼 왼쪽 혹은 오른쪽으로 옮기는 연산입니다. 쉬프트 연산자 또한 int형보다 작은 자료형은 int형으로의 연산이 작용되고 그보다 큰 자료형인 long형에서는 64비트 연산이 일어나게 됩니다. 이 때 쉬프트 연산자는 논리형인 boolean과 실수형 자료형인 float, double에서는 사용할 수 없습니다. 쉬프트 연산자는 좌쉬프트 연산자와 우쉬프트 연산자로 나눌 수 있습니다.

 

 1] Left Shift 연산자( << )

  이 연산자는 피연산자의 값을 2진 비트로 변환 후 왼쪽으로 연산을 진행합니다.

 

  예) 1 << 3

       이동 전 : 0000 0000 0000 0000 0000 0000 0000 0001   // 10진수로 1

       이동 후 : 000 0000 0000 0000 0000 0000 0000 0000 1000   // 10진수로 8

       연산 후 32비트 밖으로 밀려난 0은 버려주고 가장 끝에 이동시킬 수 만큼의 0을 붙여줍니다

       공식 : (피연산자의 값) * 2^(이동 비트 수)

 

 2] Right Shift 연산자( >> )

  이 연산자는 위의 Left Shift 연산자와 반대로 계산해주는 연산자 입니다. 이때 피연산자의 값이 양수면 0으로 채우고 음수면 1로 채우게 됩니다.

 

  예) -8 >> 3

       이동 전 : 1111 1111 1111 1111 1111 1111 1111 1000   // 10진수 값 -8

       이동 후 : 1111 1111 1111 1111 1111 1111 1111 1111   // 10진수 값 -1

 

  공식 : (피연산자의 값) / 2^(이동 비트 수)

 

 3] Unsigned Right Shift 연산자( >>> )

  이 연산자는 Right Shift 연산자와 기본원리는 같으나 피연산자의 값이 음수일 때도 앞에 0을 채운다는 점에서 다릅니다. 이 연산을 사용하게 되면 피연산자의 값에 상관없이 무조건 양수의 값이 나오게 됩니다.

 

  예) -8 >>> 3

       이동 전 : 1111 1111 1111 1111 1111 1111 1111 1000   // 10진수 값 -8

       이동 후 : 0001 1111 1111 1111 1111 1111 1111 000   // 10진수 값 536870911

 

 자바에서 사용하는 기본 메모리는 32비트입니다. 그리고 가끔씩 메모리의 절약을 위해 int형 하나의 데이터에 16비트씩 2개의 데이터를 사용하거나 8비트씩 4개의 데이터를 사용하는 경우가 있습니다. 이때 상위의 16비트를 뽑아낸다던가 하위의 16비트를 뽑아내려 할 때 이 쉬프트 연산자를 사용하면 됩니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 2  (0) 2019.04.15
자바 기본 입출력 - 문제  (0) 2019.04.11
자바 기본 입출력  (0) 2019.04.10
자바 문법 및 자료형  (0) 2019.04.09

1. 하나의 문자를 입력받아 char형 문자와 아스키 코드 값을 출력하는 코드 작성

 

 - 해답

import java.io.*;

public class Test1 {

	public static void main(String[] args) throws IOException {
		
		char ch = (char)System.in.read();
		int i = (int)ch;
		System.in.read();
		System.in.read();
		System.out.println(ch);
		System.out.println(i);

	}

}

 

2. 한 사람의 이름을 입력, 국영수의 점수를 입력받아 총점, 평균을 출력하는 코드 작성

 

 - 해답

import java.io.*;

public class Test2 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		
		String name="";
		String str="";
		int kor, eng, mat;
		
		System.out.print("이름 : ");
		name = in.readLine();
		System.out.print("국어 : ");
		str = in.readLine();
		kor = Integer.parseInt(str);
		System.out.print("영어 : ");
		str = in.readLine();
		eng = Integer.parseInt(str);
		System.out.print("수학 : ");
		str = in.readLine();
		mat = Integer.parseInt(str);
		
		System.out.println(name+"님 당신의 점수는 다음과 같습니다");
		System.out.println("총점 : "+(kor+eng+mat));
		System.out.println("평균 : "+(double)((kor+eng+mat)/3.0));

	}

}

 위의 코드에서 정수형 변수들에는 in.read() 메소드를 통해서 형변환 작업 없이 바로 입력받으려 했는데 오류가 발생했습니다. 원인을 아시는 분은 댓글에 적어주시면 감사하겠습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 2  (0) 2019.04.15
자바 연산자 - 1  (0) 2019.04.14
자바 기본 입출력  (0) 2019.04.10
자바 문법 및 자료형  (0) 2019.04.09

+ Recent posts