증감 연산자

  • 단항 연산자로 구분된다 (단항: 피연산자가 하나)
  • 피연산자의 값에 1을 더하거나 빼는 연산자(++,--)로 위치에 따라 결과 값이 다르게 나타남
  • 주의해야하는 것은 연산의 순서 
  • 전위 연산 : 먼저 전위 연산 후 다른 연산 실행
int a = 10;
int b = ++a;

 

  • 후위 연산 : 다른 연산 우선 실행 후 후위 연산
  1.  다른 연산이라는 것은 대입이나 println을 통한 출력을 의미
  2.  다른 연산, 즉 대입이나 출력을 먼저 한 후 값을 출력하는 것
  3.  어떤 연산이 있든 가장 마지막에 하는 연산이다. 
int a = 10;
int b = a++;

 

		< 증감 연산자 >
		/* 피연산자의 앞 or 뒤에 사용이 가능하다 */
		/* '++' : 1의 증가 의미 */
		/* '--' : 1의 감소 의미 */
		
		int num = 20;
		System.out.println("num : " + num);   // 20

		num++;
		System.out.println("num : " + num);   //21
		
		++num;
		System.out.println("num : " + num);   //22
		
		num--;
		System.out.println("num : " + num);   //21
		
		--num;
		System.out.println("num : " + num);   //20
		
		
		/* 증감연산자만 사용 될 때는 1증가/1감소의 의미를 가진다
		 * 하지만 문제는 다른 연산자와 함께 사용할때 전위/후위 연산의 구분이 필요하다. */
		
		int firstNum = 20;
		int result1 = firstNum++ * 3;
		
		// 후위 연산은 다른 연산을 먼저 처리하고 난 뒤 마지막에 처리 됨

		System.out.println("result1 : " + result1);   //60
		System.out.println("firstNum : " + firstNum);   //21
		
		
		int secondNum = 20;
		int result2 = ++secondNum * 3;
		// 전위 연산은 증가를 먼저 처리하고 난 뒤 다른 연산을 함
		
		System.out.println("result2 : " + result2);   //63
		System.out.println("secondNum : " + secondNum);   //21

 

 

 

 

 

비교 연산자

  • 데이터가 같은지, 다른지, 혹은 대소 비교를 할 때 사용
  • 항상 논리 값(true, false)이 결과 값
  • ‘==‘과 ‘!=‘은 모든 자료형에 사용 가능 (정수, 실수, 논리 등)
  • ‘==‘과 ‘!=‘을 제외한 비교 연산자(>, >=, <, <=)는 기본형 boolean과 참조형(String)을 제외하고
    나머지 자료형에 모두 사용 가능
'==' 연산자 / 값이 같은지 묻는 연산자
int a = 10;
int b = 11;
boolean c = a == b; (a와 b의 값이 같은지 c로 반환)
이때의 c는 false

 

'!=' 연산자 / 값이 같지 않은지 묻는 연산자
int a = 10;
int b = 11;
boolean c == a != b; (a와 b의 값이 다른지 c로 반환)
이때의 c는 true

 

		/* 비교연산자 */
		/* 비교연산자는 피연산자 사이에서 상대적인 크기를 판단하여 참 혹은 거짓을 반환하는 연산자이다.
		 * 연산자 중 참 혹은 거짓을 반환하는 연산자는 삼항 연산자의 조건식이나 조건문의 조건절에 많이 사용된다.
		 *  */
		
		/* 1. 숫자값 비교 */
		/* 1-1. 정수 비교 */
		int inum1 = 10;
		int inum2 = 20;
		
		System.out.println("===========정수값 비교============");
		System.out.println("inum1과 inum2가 같은지 비교 : " + (inum1 == inum2));
		System.out.println("inum1과 inum2가 같지 않은지 비교 : " + (inum1 != inum2));
		System.out.println("inum1과 inum2가 큰지 비교 : " + (inum1 > inum2));
		System.out.println("inum1과 inum2가 작은지 비교 : " + (inum1 < inum2));
		System.out.println("inum1과 inum2가 작거나 같은지 비교 : " + (inum1 <= inum2));
		
		// ===========정수값 비교============
		// inum1과 inum2가 같은지 비교 : false
		// inum1과 inum2가 같지 않은지 비교 : true
		// inum1과 inum2가 큰지 비교 : false
		// inum1과 inum2가 작은지 비교 : true
		// inum1과 inum2가 작거나 같은지 비교 : true
		
		
		/* 1-2. 실수 비교 */
		double dnum1 = 10.0;
		double dnum2 = 20.0;
		System.out.println("===========실수값 비교============");
		System.out.println("dnum1과 dnum2가 같은지 비교 : " + (dnum1 == dnum2 ));
		System.out.println("dnum1과 dnum2가 같지 않은지 비교 : " + (dnum1 != dnum2 ));
		System.out.println("dnum1과 dnum2가 큰지 비교 : " + (dnum1 > dnum2 ));
		System.out.println("dnum1과 dnum2가 작은지 비교 : " + (dnum1 < dnum2 ));
		System.out.println("dnum1과 dnum2가 작거나 같은지 비교 : " + (dnum1 <= dnum2 ));
		
//		===========실수값 비교============
//		dnum1과 dnum2가 같은지 비교 : false
//		dnum1과 dnum2가 같지 않은지 비교 : true
//		dnum1과 dnum2가 큰지 비교 : false
//		dnum1과 dnum2가 작은지 비교 : true
//		dnum1과 dnum2가 작거나 같은지 비교 : true
		
		
		/* 2. 문자값 비교 */
		char ch1 = 'a';
		char ch2 = 'A';
		System.out.println("===========문자값 비교============");
		System.out.println("ch1과 ch2가 같은지 비교 : " + (ch1 == ch2 ));
		System.out.println("ch1과 ch2가 같지 않은지 비교 : " + (ch1 != ch2 ));
		System.out.println("ch1과 ch2가 큰지 비교 : " + (ch1 > ch2 ));
		System.out.println("ch1과 ch2가 작은지 비교 : " + (ch1 < ch2 ));
		System.out.println("ch1과 ch2가 작거나 같은지 비교 : " + (ch1 <= ch2 ));
		
		//===========문자값 비교============
		//ch1과 ch2가 같은지 비교 : false
		//ch1과 ch2가 같지 않은지 비교 : true
		//ch1과 ch2가 큰지 비교 : true
		//ch1과 ch2가 작은지 비교 : false
		//ch1과 ch2가 작거나 같은지 비교 : false
		
		
		/* 3. 논리값 비교 */
		boolean bool1 = true;
		boolean bool2 = false;
		System.out.println("===========논리값 비교============");
		System.out.println("bool1과 bool2가 같은지 비교 : " + (bool1 == bool2 ));
		System.out.println("bool1과 bool2가 같지 않은지 비교 : " + (bool1 != bool2 ));
//		System.out.println("bool1과 bool2가 큰지 비교 : " + (bool1 > bool2 ));
//		System.out.println("bool1과 bool2가 크거나 같은지 비교 : " + (bool1 >= bool2 ));
//		System.out.println("bool1과 bool2가 작은지 비교 : " + (bool1 < bool2 ));
//		System.out.println("bool1과 bool2가 작거나 같은지 비교 : " + (bool1 <= bool2 ));
		
// 주석처리한 부분은 비교가 불가능한 것, true와 false 값의 대소를 비교할 수 없다.




		/* 4. 문자열값 비교 */
		/* 문자열도 ==과 !=은 비교가 가능하지만 대소비교는 불가능하다. */
		String str1 = "java";
		String str2 = "java";
		System.out.println("===========문자열값 비교============");
		System.out.println("str1과 str2가 같은지 비교 : " + (str1 == str2 ));
		System.out.println("str1과 str2가 같지 않은지 비교 : " + (str1 != str2 ));
//		System.out.println("str1과 str2가 큰지 비교 : " + (str1 > str2 ));
//		System.out.println("str1과 str2가 크거나 같은지 비교 : " + (str1 >= str2 ));
//		System.out.println("str1과 str2가 작은지 비교 : " + (str1 < str2 ));
//		System.out.println("str1과 str2가 작거나 같은지 비교 : " + (str1 <= str2 ));
		
//		===========문자열값 비교============
//		str1과 str2가 같은지 비교 : true
//		str1과 str2가 같지 않은지 비교 : false

 

 

 

 

논리 연산자

논리 값(true, false)를 취급하는 연산자
  • && : 두 피연산자가 모두 true일 때 true 반환 (AND)
  • || : 두 피연산자 중 하나만 true여도 true 반환 (OR)
a b a && b a || b
true true true true (추정 불필요)
true false false true (추정 불필요)
false true false (추정 불필요) true
false false false (추정 불필요) false

 

* 추정 불필요?
이미 첫번째 조건만으로 판단근거가 나왔기에 두번째 조건을 수행할 이유가 없는 경우. 컴퓨터는 연산을 효율적으로 한다. 각 연산자의 특징에 기반해서, 굳이 확인을 안해도되는 경우는 확인을 안한다. or같은 경우 하나만 true여도 true를 반환한다. 그러므로 a값에서 true값을 확인했다면 b부분은 확인하지않고 넘어간다. 

 

 

 

 

 

논리 연산자

  • 논리 값을 부정하여 반대 값으로 변경
  • 제어문을 활용할 때 많이 쓰임
  • 논리 부정 연산자
boolean bool1 = true;
boolean bool2 != bool1;

 

		/* 논리 연산자 */
		/* 논리값(true or false)을 취급하는 연산자이다. */
		
		/* 1. 논리 연산자 결과 값 확인 */
		System.out.println("true와 true의 논리 and 연산 : " + (true && true) );
		System.out.println("true와 false의 논리 and 연산 : " + (true && false));
		System.out.println("false와 true의 논리 and 연산 : " + (false && true));
		System.out.println("false와 false의 논리 and 연산 : " + (true && false));
		
		//Dead code가 뜨는 이유? 코드 흐름자체가 도달하지 않으므로 추정 불필요를 의미
// 콘솔창은 다음과 같이 출력
//		true와 true의 논리 and 연산 : true
//		true와 false의 논리 and 연산 : false
//		false와 true의 논리 and 연산 : false
//		false와 false의 논리 and 연산 : false
		
		
		
		System.out.println("true와 true의 논리 or 연산 : " + (true || true) );
		System.out.println("true와 false의 논리 or 연산 : " + (true || false));
		System.out.println("false와 true의 논리 or 연산 : " + (false || true));
		System.out.println("false와 false의 논리 or 연산 : " + (true || false));
		
// 콘솔창은 다음과 같이 출력		
//		true와 true의 논리 or 연산 : true
//		true와 false의 논리 or 연산 : true
//		false와 true의 논리 or 연산 : true
//		false와 false의 논리 or 연산 : true
		
		
		System.out.println("true와 논리 not 연산 : " + (!true));
		System.out.println("false의 논리 not 연산 : " + (!false));
//		true와 논리 not 연산 : false  //콘솔
//		false의 논리 not 연산 : true  //콘솔
		
		
		/* 2. 논리식에 논리연산자 활용 */
		int a = 10;
		int b = 20;
		int c = 30;
		int d = 40;
		
		System.out.println("a가 b보다 작으면서 c가 d보다 작은지 확인 : " + (a < b && c < d));
		System.out.println("a가 b보다 작으면서 c가 d보다 큰지 확인 : " + (a < b && c > d));
		System.out.println("a가 b보다 크면서 c가 d보다 작은지 확인 : " + (a > b && c < d));
		System.out.println("a가 b보다 크면서 c가 d보다 큰지 확인 : " + (a > b && c > d));
//콘솔창		
//		a가 b보다 작으면서 c가 d보다 작은지 확인 : true
//		a가 b보다 작으면서 c가 d보다 큰지 확인 : false
//		a가 b보다 크면서 c가 d보다 작은지 확인 : false
//		a가 b보다 크면서 c가 d보다 큰지 확인 : false
		
		System.out.println("a가 b보다 작거나 c가 d보다 작은지 확인 : " + (a < b || c < d));
		System.out.println("a가 b보다 작거나 c가 d보다 큰지 확인 : " + (a < b || c > d));
		System.out.println("a가 b보다 크거나 c가 d보다 작은지 확인 : " + (a > b || c < d));
		System.out.println("a가 b보다 크거나 c가 d보다 큰지 확인 " + (a > b || c > d));
//콘솔창	
//		a가 b보다 작거나 c가 d보다 작은지 확인 : true
//		a가 b보다 작거나 c가 d보다 큰지 확인 : true
//		a가 b보다 크거나 c가 d보다 작은지 확인 : true
//		a가 b보다 크거나 c가 d보다 큰지 확인 false
		/* 논리 연산자의 우선순위와 활용 */
		/* && : 11순위
		 * || : 12순위
		 * && 연산자가 ||연산자보다 우선순위가 높다
		 *  */
		
		/* 1. 1부터 100사이의 값인지 확인 */
		/* 1 <= 변수 <= 100 ============== 수학적으로 했던 표현이므로 이렇게는 사용x 
		 * 변수 >= 1 && 변수 <=100 ======== 이렇게 사용해야 한다. */ 
		int num1 = 55;
		System.out.println("1부터 100사이인지 확인 : " + (num1 >= 1 && num1 <= 100));
		// 1보다 크거나 같으면서 100보다 작거나 같은지 확인 
		int num2 = 105;
		System.out.println("1부터 100사이인지 확인 : " + (num2 >= 1 && num2 <= 100));
//		1부터 100사이인지 확인 : true
//		1부터 100사이인지 확인 : false
		
		
		
		
		/* 2. 영어 대문자인지 확인 */
		/* 영어 대문자냐? ---> 문자변수 >= 'A' && 문자변수 <= 'Z' */
		char ch1 = 'G';
		System.out.println("영어 대문자인지 확인 : " + (ch1 >= 'A' && ch1 <= 'Z'));
		char ch2 = 'g';
		System.out.println("영어 대문자인지 확인 : " + (ch2 >= 'A' && ch2 <= 'Z'));		
//		영어 대문자인지 확인 : true
//		영어 대문자인지 확인 : false
		
		
		
		/* 3. 대소문자 상관없이 영문자 y인지 확인 */
		/* 문자변수 == 'y' || 문자변수 == 'Y' */
		char ch3 = 'Y';
		System.out.println("영문자 y인지 확인 : " + (ch3 == 'y' || ch3 == 'Y'));
		
		char char4 = 'y'; 
		System.out.println("영문자 y인지 확인 : " + (ch3 == 'y' || ch3 == 'Y'));
//		영문자 y인지 확인 : true
//		영문자 y인지 확인 : true
		
		
		
		
		/* 4. 영문자인지 확인 */
		/* A: 65, Z:90, a: 97, z: 122 (중간에 91~96은 영문자가 아님) */
		/* 연산자 우선순위를 고려한다면 and 연산이 먼저 수행되기 때문에 괄호를 묶지 않아도 되지만
		 * 논리적으로 먼저 실행하는 내용을 괄호로 묶어주면 코드를 읽기에 좋다. */
		
		char ch5 = 'f';
		System.out.println("영문자인지 확인 : " + ((ch5 >= 'A' && ch5 <= 'Z') || (ch5 >= 'a' && ch5 <= 'z')));
		
		char ch6 = 'F';
		System.out.println("영문자인지 확인 : " + ((ch6 >= 'A' && ch6 <= 'Z') || (ch6 >= 'a' && ch6 <= 'z')));
		
//		영문자인지 확인 : true
//		영문자인지 확인 : true	
		
		
		char ch7 = '가';
		System.out.println("영문자인지 확인 : " + ((ch7 >= 'A' && ch7 <= 'Z') || (ch7 >= 'a' && ch7 <= 'z')));
		
//		영문자인지 확인 : false

 

		/* AND 연산과 OR 연산자의 특징
		 * 논리식 && 논리식 : 앞의 결과가 false이면 뒤를 실행 안함
		 * 논리식 || 논리식 : 앞의 결과가 true이면 뒤를 실행 안함 \
		 * */
		
		/* 1. 논리식 && 논리식 : 앞의 결과가 false이면 뒤를 실행 안함  */
		/* 조건식 두개가 모두 만족해야 true를 반환하지만 앞에서 미리 false가 나오게되면
		 * 뒤의 조건을 확인할 필요 없이 false를 반환한다.
		 * 따라서 연산 횟수를 줄이기 위해서는 &&연산의 경우 앞에 false가 나올 가능성이 높은 조건을 
		 * 작성하는 편이 좋다. */
		
		int num1 = 10;
		int result1 = (false && ++num1 > 0) ? num1 : num1;
		
		System.out.println("&& 실행 확인 : " + result1);
		// && 실행 확인 : 10   // 콘솔창
		
		
		
		/* 2. 논리식 || 논리식 : 앞의 결과가 true 이면 뒤를 실행 안함 */
		/* 조건식 둘 중 하나라도 true를 반환하면 true를 반환하기 때문에 앞에서 미리 true가 나오면
		 * 뒤의 조건을 확인할 필요도 없이 true를 반환한다.
		 * 따라서 연산 횟수를 줄이기 위해서는 ||연산의 경우 앞에 true 가 나올 가능성이 높은 조건을 작성하는 편이 좋다. */
		
		int num2 = 10;
		int result2 = (true || ++num2 > 0) ? num2 : num2;
		System.out.println("||실행을 확인 : " + result2);
		// ||실행을 확인 : 10   //콘솔창

 

 

 

 

 

삼항 연산자

  • 자바에서 유일하게 피연산자 항목이 3개인 연산자
  • 공식 
조건식 ? 식1 : 식2;
  • 조건식의 결과 값(true or false)에 따라 연산을 처리하는 방식
  • 결과 값이 참일 경우 식1, 거짓일 경우 식2 수행
  • 삼항 연산자 안에 삼항 연산자를 중첩하여 쓰는 것도 가능
< 삼항연산자 >
int result1 = a > b ? a++ : b--;
int result2 = a < b ? a++ : (b == 0 ? a-- : b++)     ---- 삼항연산자 내부 삼항연산자 중첩
  • 후위 연산자이므로 값으로 도출된 a혹은 b는 result에 값을 대입한 뒤 증감이 이루어 질것이다. 
  • 단 조건문이 복잡해 지는 경우 삼항연산자를 쓰는것을 지양한다. 

 

		/* 삼항 연산자 */
		/* 자바에서 유일하게 피연산자 항목이 3개인 연산자이다. */
		/* 삼항연산자 공식 -> 조건식 ? 참일때 사용값1 : 거짓일시 사용값2 */
		/* 조건식은 반드시 결과가 true 또는 false로 나오게끔 작성해야 함
		 * 비교/논리 연산자가 주로 사용 됨 */
		
		int num1 = 10;
		int num2 = -10;
		String result1 = (num1 > 0 ) ? "양수이다." : "양수가 아니다.";
		String result2 = (num2 > 0 ) ? "양수이다." : "양수가 아니다.";

		System.out.println("num1은 " + result1);
		System.out.println("num2은 " + result2);		
		
//		콘솔창
//		num1은 양수이다.
//		num2은 양수가 아니다.
		
		
		/* 삼항연산자의 중첩사용도 가능하다. */
		int num3 = 5;
		int num4 = 0;
		int num5 = -5;
		
		String result3 = (num3 > 0) ? "양수이다." : (num3 == 0) ? "0이다." : "음수이다.";
		String result4 = (num4 > 0) ? "양수이다." : (num4 == 0) ? "0이다." : "음수이다.";
		String result5 = (num5 > 0) ? "양수이다." : (num5 == 0) ? "0이다." : "음수이다.";
		
		System.out.println("num3은 " + result3);
		System.out.println("num4은 " + result4);
		System.out.println("num5은 " + result5);
		
//		콘솔창
//		num3은 양수이다.
//		num4은 0이다.
//		num5은 음수이다.

 

 

 

 

연산자 종류와 우선 순위

 

종류 구분 세부구분 연산자 우선순위
최우선 연산자 직접 접근 연산자   ( ) . { } 1
단항 연산자     + - ! (자료형) ++ -- 2
이항 연산자 산술 연산자   * / % 3
+ - 4
쉬프트 연산자   >>  <<  >>> 5
비교 연산자   >  <  >=  <== 6
==  != 7
논리 연산자 비트 논리 연산자 & 8
^ 9
| 10
일반 논리 연산자 && 11
|| 12
삼항 연산자     (조건식) ? 참값 : 거짓값 13
대입 연산자 순수대입   = 14
복합대입 산술 대입 +=  -=  *=  /=  %=
  쉬프트 대입 <<=  >>=  >>>=
  비트 논리 대입 &=  ^=  |=
나열 연산자     , 15

 

 

 

 

 

 

 

 

더보기

학습점검


✅ 연산자 우선순위의 개념을 이해할 수 있다.
✅ 산술 연산자를 이용하여 데이터 연산을 수행할 수 있다.
✅ 복합 대입 연산자를 이용하여 데이터 연산을 수행할 수 있다.
✅ 증감 연산자를 이용하여 데이터 연산을 수행할 수 있다.
✅ 비교 연산자를 이용하여 데이터 연산을 수행할 수 있다.
✅ 논리 연산자를 이용하여 데이터 연산을 수행할 수 있다.
✅ 삼항 연산자를 이용하여 데이터 연산을 수행할 수 있다.
✅ 연산자 우선순위를 활용하여 데이터 연산을 수행할 수 있다.

 

 

 

메소드

특정 작업을 수행하기 위한 명령문의 집합
  • 수학에서의 함수와 비슷한 의미. 함수는 무언가 연산을 하여 값을 도출하듯 메소드 역시 값을 받아 연산을 하여 결과값을 도출, 어떠한 작업을 수행하는지는 메소드에 따라 다르다.

 

  • 메소드는 다른 메소드를 호출 가능 (메소드를 호출한 곳으로 돌아옴)
		/* 메소드란? */
		/* 메소드(method)는 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.
		 * 자세한 메소드 사용법은 객체 부분에서 다루게 되니 지금은 호출 흐름에 대해 이해할 수 있도록 하자
		 *  */
		
		System.out.println("main() 시작됨...");
		
		
		/* 작성한 메소드 호출 */
		/* 클래스명 사용할 이름 = new 클래스명();     // 객체생성
		 * 사용할 이름.메소드명()                   // 메소드 호출
		 * */
		
		Application1 app1 = new Application1();      //메소드가 선언된 클래스를 이와같이 작성
		app1.methodA();                              //methodA를 호출하고 싶다면 이와같이 작성한다. 
		
		System.out.println("main() 종료됨...");
	}
	
	

	/* 호출 확인을 위한 메소드 */
	public void methodA() {
		
		System.out.println("methodA() 호출함...");
		
		methodB();           //위 객체생성순서와 호출방식이 약간 다르지만 우선 호출 흐름에 집중해서 확인하기
		
		System.out.println("methodA() 종료됨...");
	}
	
	
	
	
	/* 호출 확인을 위한 메소드 */
	public void methodB() {
		
		System.out.println("methodB() 호출됨...");		
		
		methodC();
		
		System.out.println("methodB() 종료됨... ");
	}
	
	
	
	
	/* 호출 확인을 위한 메소드 */
	public void methodC() {
		
		System.out.println("methodC 호출함...");
		System.out.println("methodC 종료됨...");
	}

	
	
	
    // 콘솔창은 다음과 같다. 
	//main() 시작됨...
	//methodA() 호출함...
	//methodB() 호출됨...
	//methodC 호출함...
	//methodC 종료됨...
	//methodB() 종료됨... 
	//methodA() 종료됨...
	//main() 종료됨...

	
	
	
	
	
}

 

public class Application2 {

	public static void main(String[] args) {
		
		/* 메소드 호출 흐름 연습 */
		/* Application1 에서 했던 것과 비슷하지만 호출 흐름을 메인 메소드에서 제어해보자 */
		
		
		
		System.out.println("main() 시작함...");
		
		/* methodA(), methodB(), methodC() 를 차례대로 호출한다. */
		Application2 app2 = new Application2();
		app2.methodA();
		app2.methodB();
		app2.methodB();
	
		System.out.println("main() 종료됨...");
		
	}

	
	
	public void methodA() {
		
		System.out.println("methodA() 호출됨...");
		System.out.println("methodA() 종료됨...");
	}
	
	
	
	
	public void methodB() {
		
		System.out.println("methodB() 호출됨...");
		System.out.println("methodB() 종료됨...");
	}
	
	
	
	
	public void methodC() {
		
		System.out.println("methodC() 호출됨...");
		System.out.println("methodC() 종료됨...");
	}
	
	
	
	// 콘솔창
	//main() 시작함...
	//methodA() 호출됨...
	//methodA() 종료됨...
	//methodB() 호출됨...
	//methodB() 종료됨...
	//methodB() 호출됨...
	//methodB() 종료됨...
	//main() 종료됨...

	
	
	
}

 

 

값을 전달하면서 메소드를 실행하기
  1. 메소드 실행 시 어떠한 값을 미리 줄 수 있는데 이 값을 전달인자라고 한다. 
  2. 전달인자가 없으면 비워 둘 수 있다    ->    ( )
  3. 그 값을 활용(매개변수)해서 메소드 수행 가능
method (50) public void methodA (int var) {
     System.out.println(var);
}
50은 전달인자 int var는 매개변수

 

public class Application3 {

	public static void main(String[] args) {

		/* 전달인자(argument)와 매개변수(parameter)를 이용한 메소드 호출
		 * 
		 *  지금까지 우리가 배운 변수는 지역변수에 해당한다. 
		 *  다양한 변수의 종류들이 존재하는데 이는 차차 배우게 될 것이다.
		 *  
		 *  1. 지역변수 - 지역변수는 그 메소드안에서만 유효하다.
		 *  2. 매개변수 - 다른 메소드끼리 전달해도 유효한 변수
		 *  3. 전역변수(필드)
		 *  4. 클래스(static) 변수
		 *  
		 *  
		 *  지역 변수는 선언한 메소드 블럭 내부에서만 사용이 가능하다. 이것을 지역변수의 스코프라고 한다.
		 *  다른 메소드간 서로 공유해야 하는 값이 존재하는 경우, 메소드 호출 시 사용하는 괄호를 이용해서 값을 전달할 수 있다.
		 *  이 때 전달하는 값을 전달 인자(argument) 라 부르고,
		 *  메소드 선언부 괄호 안에 전달 인자를 받기 위해 선언하는 변수를 매개변수(parameter)라고 부른다.
		 *  
		 *  */


	}

 

 

 

 

 

매개변수의 개수나 자료형의 제한은 없으며 상수(final 키워드)도 사용 가능함

 

public class Application3 {

	public static void main(String[] args) {

		/* 전달인자(argument)와 매개변수(parameter)를 이용한 메소드 호출
		 * 
		 *  지금까지 우리가 배운 변수는 지역변수에 해당한다. 
		 *  다양한 변수의 종류들이 존재하는데 이는 차차 배우게 될 것이다.
		 *  
		 *  1. 지역변수 - 지역변수는 그 메소드안에서만 유효하다.
		 *  2. 매개변수 - 다른 메소드끼리 전달해도 유효한 변수
		 *  3. 전역변수(필드)
		 *  4. 클래스(static) 변수
		 *  
		 *  
		 *  지역 변수는 선언한 메소드 블럭 내부에서만 사용이 가능하다. 이것을 지역변수의 스코프라고 한다.
		 *  다른 메소드간 서로 공유해야 하는 값이 존재하는 경우, 메소드 호출 시 사용하는 괄호를 이용해서 값을 전달할 수 있다.
		 *  이 때 전달하는 값을 전달 인자(argument) 라 부르고,
		 *  메소드 선언부 괄호 안에 전달 인자를 받기 위해 선언하는 변수를 매개변수(parameter)라고 부른다.
		 *  
		 *  */


		Application3 app3 = new Application3();
		
		/*  전달 인자와 매개변수를 이용한 메소드 호출 테스트  */
		/* 1. 전달 인자로 값 전달 테스트 */
		/* 호출하려는 메소드의 매개변수 선언부에 미리 선언해둔 자료형 타입과 갯수, 순서가 일치하게 값을 넣어 호출한다.
		 *  */
		
		app3.testMethod(30);
		//app3.testMethod("40");
		// The method testMethod(int) in the type Application3 is not applicable for the arguments (String)
		// 매개변수는 int 형이지만 인자가 String 형이기 때문에 호출될 수 없다.
		
		//app3.testMethod(20, 30, 40);
		// The method testMethod(int) in the type Application3 is not applicable for the arguments (int, int, int)
		// 매개변수는 int 형 한개지만 인자는 3개이기 때문에 호출할 수 없다.
		
		//app3.testMethod();
		//The method testMethod(int) in the type Application3 is not applicable for the arguments ()
		// 매개변수는 선언되어 있지만 인자로 값을 전달하지 않으면 호출할 수 없다. 
	
		
		
		/* 2. 변수에 저장한 값 전달 테스트 */
		/* 2-1. 변수에 저장 된 없을 이용하여 값을 전달할 수 있다. */
		
		int age = 20;
		app3.testMethod(age);    //변수값으로 전달
		
		// 같은 age를 메소드에도 인트 변수에도 똑같이 쓸 수 있을까?
		// 결론은 된다. 왜냐하면 age는 지역 변수이므로, 각자의 지역에서만 사용되며, 각자의 지역안에서는 중복되면 안되지만 엄연히 다른 지역에 있는 것이기 때문
		// 같은 지역 내에서 같은 변수명을 사용하는 것은 안된다. 
		
	
		
		/* 2-2. 자동형변환을 이용하여 값 전달을 할 수 있다. */
		byte byteAge = 10;
		app3.testMethod(byteAge);
		
		
		
	
		/* 2-3. 강제형변환을 이용하여 값 전달을 할 수 있다. */
		long longAge = 80;
		app3.testMethod((int) longAge); 
		// app3.testMethod(longAge); 
		// 컴파일 에러: The method testMethod(int) in the type Application3 is not applicable for the arguments (long)
		// int 로 강제형변환을 하여 전달을 하게되면 문제없다. 
		
		
		
		/* 2-4. 연산 결과를 이용해서 값 전달을 할 수 있다. */
		app3.testMethod(age * 3);
		
		
		
	}

	
	
	
	public void testMethod(int age) {
		// int age = 10;    // 매개 변수에서 선언된 변수명과 같은 지역변수를 선언할 수 없다. 
		System.out.println("당신의 나이는 " + age + "세 입니다.");
		

	}
	
	// 메소드를 호출하며 어떤 값을 input 할 수 있다.
	// 단 값을 넘길때 선언해둔 자료형과 갯수와 순서가 일치해야만 한다. 그렇지않으면 컴파일 오류가 난다. 
	// 이를 전달인자라고 부르고. 전달인자를 받기위해 선언하는 변수를 매개변수라 한다.

 

/** 
 * <pre>
 * Class : Application4
 * Comment : 여러개의 전달인자와 매개변수를 이용한 메소드 호출
 * History : 
 * <2021/12/21 (임수연) 처음작성함>
 * <2021/12/31 (아무개) 수정함
 * </pre>
 * @author 임수연
 * @version 1.0.0 
 * */





public class Application4 {

	public static void main(String[] args) {


		
		
		/* 여러 개의 전달 인자를 이용한 메소드 호출 테스트 */
		Application4 app4 = new Application4();
		app4.testMethod("유관순", 15, '여');
		
		/* */            // 범위주석
		//               //한줄주석
		/** */           // 앞에 별이 두개붙으면, 문서에대해서 설명할때 붙이는 주석, 무언가 문서적인 설명을 하고자 할때 사용.
		

		// app4.testMethod(20, "홍길동", '남');
		// The method testMethod(String, int, char) in the type Application4 is not applicable for the arguments (int, String, char)
		// 왜 오류가 날까? 값의 개수는 맞지만 순서가 다르게 전달되면 호출하지 못한다. 정해진 순서대로 전달해야 함
		
		
		
		/* 변수에 저장된 값을 전달하며 호출할 수 있다. */
		String name = "신사임당";
		int age = 40;
		char gender = '여';
		
		app4.testMethod(name, age, gender);
		
		
		
		
		
		
	}

	
	
	/** 
	 * <pre>
	 * 이름과 나이와 성별을 전달받아 한 번에 출력해주는 기능을 제공합니다.
	 * </pre>
	 * @param name 출력할 이름을 전달 해 주세요
	 * @param age 출력할 나이를 전달 해 주세요
	 * @gender gender 출력할 성별을 전달해주세요. 성별은 변경되지 않을 것을 보장합니다. 
	 * */
	
	
	
	
	public void testMethod(String name, int age, final char gender) {
		/* 매개변수도 일종의 지역변수로 구분된다.
		 * 매개변수 역시 final 키워드를 사용할 수 있다. 
		 * 지역변수에 final 키워드를 붙여 상수를 만드는 것과 동일하다.
		 * final 매개변수는 상수 네이밍 규칙을 선택적으로 따르는 경향이 있다. (써도 되고 안써도 됨) 
		 * 즉 늘 대문자로 작성하기를 권할때와는 달리 상수가 매개변수로 쓰일땐 굳이 대문자만 고집하지 않아도 된다.
		 * */
		System.out.println("당신의 이름은 " + name + "이고, 나이는 " + age + "세 이며, 성별은 " + gender + "입니다.");
		
		
		
	
	}
	
	
	
	
}

 

 

 

 

'Programming > JAVA' 카테고리의 다른 글

스캐너와 조건문  (0) 2021.12.23
메소드  (0) 2021.12.22
변수와 리터럴  (0) 2021.12.20
변수 파트 암기할 표 정리  (0) 2021.12.18
변수  (0) 2021.12.17

 

변수의 명명 규칙

컴파일 에러를 발생시키는 규칙

1. 동일한 범위 내에서 동일한 변수명을 가질 수 없다.
2. 예약어 사용이 불가능하다. (주요 예약어 참고)

 - 자료형을 변수명으로 사용할 수 없다.
3. 대/소문자를 구분한다.

4. 숫자로 시작할 수 없다.

int age1 = 5; (o)
int 1age = 5; (x)

 

5. 특수문자는 ‘_’ (언더바)와 ‘$’(달러) 만을 허용한다.

 

 

 

 

 

변수의 명명 규칙(2)

(개발자들 간의 암묵적 규칙, 안지키더라도 컴파일 에러는 나지않는다. )

 

1. 길이의 제한은 없지만 적당한 길이의 변수명 작성하는 것이 좋다.
2. 합성어일 경우 첫 단어는 소문자로 시작하며, 두 번째 단어부터는 대문자로 시작(camel-case)

 - 변수의 시작은 무조건 소문자, 두번째 단어부터 대문자 ex) isTrue

 - 중간의 대문자가 옴으로서 낙타의 등처럼 생겼다고 해서 camel-case라고 함
3. 단어와 단어 사이에 언더스코어(_) 사용 안 함

 - 단어와 단어사이는 '대문자로 구분'짓는 2번의 방법 사용
4. 한글로 변수명을 짓는 것이 가능하지만, 권장하지는 않는다.
5. 변수 안에 저장된 값이 어떤 의미를 가지는지 알 수 있도록 이름을 짓는다.

 - 변수에 어떤 값이 저장되는지 유추가 가능하도록 이름 짓는 편이 좋다. 

6. 전형적인 변수명이 있으면 가급적 그것으로 사용한다.
7. 명사형으로 작성한다.
8. boolean형은 의문문으로 작성하되 가급적이면 긍정형으로 네이밍한다.

 - isDeath와 isAlive 쪽이 낫다. 

 

* 이클립스에 뜨는 노란색은 경고와 같은것, 불필요한 선언이 일어나지는 않았는지 확인하자.

* 클래스명만 대문자로 시작한다.

 

< 변수의 명명 규칙 >
/* 변수의 이름을 지을 때 아무렇게나 짓는 것이 아닌 정해진 규칙이 있다.
 * 실무적으로는 굉장히 중요하기 때문에 반드시 숙지해야 하고,
* 또한, 규칙에 맞는 올바른 변수명을 짓는 것이 좋은 프로그래밍을 하는 첫 단추이다.
 *  */
		
/* 1. 컴파일 에러를 발생시키는 규칙 */
/* 1-1. 동일한 범위 내에서 동일한 변수 명을 가질 수 없다. */
		
int age = 20;
// int age = 30; //위와 동일한 변수 명을 가지므로 에러 발생
		
        
/* 1-2. 예약어는 사용 불가능하다. */
// boolean true = true;
// int int = 10; //예약어를 사용했기 때문에 오류발생
		
        
/* 1-3. 변수명은 대 소문자를 구분한다. */
int Age = 20;   // 위에서 만든 age와 다른 것으로 취급한다.
int True = 10;  // 예약어 True와 다른 것으로 취급한다.
		
		
/* 1-4. 변수명은 숫자로 시작할 수 없다. */
// int 1age = 20;   // 숫자로 시작해서 에러발생
int age1 = 20;      // 숫자로 시작하지 않는다면 혼용해서 사용가능
		
		
/* 1-5. 특수기호는 '_'와 '$'만 사용 가능하다. */
//int sh@rp = 20;   // 사용 가능한 특수문자 외에는 사용 불가능
int _age = 20;      // 언더스코어는 사용가능함, 처음, 중간, 끝 모두 가능
int $harp = 20;     // $도 사용 가능함, 처음, 중간, 끝 모두 가능
		
        
/* 2. 컴파일 에러를 발생시키지는 않지만 개발자들끼리의 암묵적인 규칙 */
/* 2-1. 변수명의 길이 제한은 없다. */
		
int abcdsfoekposfpoeifpsofieosjfilseflkshlkfjealkjwela;
// 이렇게 짓는다고 해도 컴파일 에러는 뜨지않음, 다만 적당한 길이의 이름 필요
		
/* 2-2. 변수명이 합성어로 이루어진 경우 첫 단어는 소문자, 두 번째 시작 단어는 대문자로 시작한다. */
/* 자바에서는 클래스명만 유일하게 대문자로 시작한다. 그 외의 나머지는 전부 소문자로 작성 */
int maxAge = 20;
int minAge = 10;   //낙타의 등처럼 생겼다고 하여 camel-cage 라고한다.

 

 

 

 

 

상수란?

수식에서 변하지 않는 값을 뜻한다.
  • 변하는 값인 변수와 반대이다. 
  • 컴퓨터(Java)에서는 프로그램이 실행되는 동안 '값이 고정되어 변경할 수 없는 메모리 공간'을 의미
  • 상수 선언 방법 (final 키워드 필요, 더이상 값의 변경이 불가능함을 의미)
 final int AGE;

 

 

상수 초기화 방법
  • 1) 선언과 동시에 초기화
final int NUM =100;
  • 2) 선언 후 초기화
final int NUM;
NUM = 100;

* 중요: 초기화 이후 다른 데이터(값)을 대입할 수 없음

 

 

 

 

 

상수의 명명 규칙

변수와 다르지 않으나 개발자들 간의 암묵적 규칙에서 차이가 있다.
  • 1. 모든 문자는 영문자, 대문자, 혹은 숫자만 사용
  • 2. 단어와 단어 사이는 언더스코어(_)를 사용

(상수와 상수는 대문자로 쓰니까 카멜케이스를 적용할 수 없으므로 언더스코어 사용)

 

< 상수란 ?>
/ * 변수가 메모리에 변경할 값을 저장하기 위한 공간을 나타낸다면, 상수는 이와 상반되는 개념이다.
* 변하지 않는 값을(항상 고정된 값을) 저장해두기 위한 메모리상의 공간을 상수라고 한다.
 * 
 *  상수의 사용목적
 *  변경되지않는 고정된값을 저장할 목적으로 사용한다.
 *  초기화 이후 값 대입시 컴파일 일어를 발생시켜 값이 수정되지 못하게 한다.
 *  예) 수학 공식에 사용되는 수치 등 
 *  
 *  사용방법
 *  1. 상수를 선언한다. (변수선언과 유사하지만 final 키워드 사용)
 *  2. 값을 초기화 한다. (초기화 이후에는 값 변경 불가능)
 *  3. 필요한 위치에 상수를 호출해서 사용한다.
 *  */
		
		
/* 1. 상수 선언 */
final int AGE;
		
        
/* 2. 초기화 */
AGE = 20;
//AGE = 30;   

//  The final local variable AGE may already have been assigned 라는 메세지가 뜸 
// 한 번 초기화 한 이후 값을 재대입하는 것은 불가능하다. 
		
		
/* 3. 필요한 위치에 상수를 호출해서 사용한다. */
/* 3-1. 출력 구문에서 사용 */

System.out.println("AGE의 값 : " + AGE);
		
        
/* 3-2. 필요시 연산식에 호출해서 사용 */

System.out.println("AGE의 2배 : " + (AGE *2));
		
        
/* 3-3. 대입 연산시 활용 */
int sum = AGE;   // 대입 연산자의 오른 편(재정의X)에는 기술 가능함

 

< 상수의 명명 규칙 >
/* 상수의 명명 규칙은 변수의 명명규칙과 컴파일 에러를 발생시키는 규칙은 동일하다
 * 단, 개발자들 끼리의 암묵적인 규칙에서 일부 차이를 보인다. 
 *  
 * 1. 모든 문자는 영문자 혹은 대문자 혹은 숫자만 사용한다.
 * 2. 단어와 단어의 연결은 언더스코어(_)를 사용한다. (camel-case가 아니기에)
 * */
		
		
/* 1. 모든 문자는 영문자 대문자 혹은 숫자만 사용한다. */
final int AGE1 = 20;
final int AGE2 = 30;
final int age3 = 40;   // 소문자로 사용은 가능하지만 변수와 구분하기 힘들기 때문에 만들어진 규칙이다. 
		
		
/* 2. 단어와 단어 연결은 언어스코어(_)를 사용한다. */
final int MAX_AGE = 60;
final int MIN_AGE = 20;
final int minAGE = 30;      //camel case 사용이 가능하지만 역시 변수와 구분되지 않는다.

 

 

 

 

변수를 사용할때 주의해야하는 점들 1

 

데이터 오버플로우
  • 1byte 는 8 bit 
A              
  • A 가 0일시 - 양수 
  • A 가 1일시 - 음수
  • 허용된 범위 이상의 비트를 침범하게 되는 것을 오버플로우라고 함

예) 전자시계가 표현할 수 있는 범위 (00~23 / 00~59 / 00~59) 처럼 표현 할 수 있는 범위가 정해져 있으며(-128 ~ 127) 이를 넘어갈시 초기화됨

 

 

위의 것을 암기할 필요는 없다. 다만 유의할 점 
데이터는 제한된 범위를 가지고 할당되기때문에 알맞은 값의 범위를 쓰지않으면 예상하지못한 결과가 나올 수 있다. 오버플로우라는 현상에 대해서는 이해하고 넘어가야 한다. 

 

 

컴퓨터의 음수처리
  • 컴퓨터는 2의 보수법이라는 개념과 MSB를 사용하여 음수를 처리
  • 2의 보수법을 하기 위해서는 2진수에 1의 보수를 적용하고 이후 2의 보수를 구하여야 함

 

< 오버플로우 >
/* 자료형 별 값의 최대 범위를 벗어나는 경우
 * 초과한 값을 버림처리하고 sign bit를 반전시켜 최소값으로 순환시킴 */
		
byte num1 = 127;
System.out.println("num1 : " + num1);    //127: byte의 최대 저장 범위

num1++;     // 1증가
		
System.out.println("num1 overflow : " + num1);
// -127 : byte 의 최소저장 범위

콘솔창에서 127에 1을 증가시킨값이 최소값 -128로 순환된 것을 통해 오버플로우 현상을 확인 해 볼 수 있다.

 

 

 

< 언더플로우 >
/* 오버플로우의 반대개념으로 최소범위보다 작은 수를 발생시키는 경우 발생하는 현상 */
		
// byte num2 = -129;
// 컴파일 에러가 다음과 같이 뜬다./
// Type mismatch: cannot convert from int to byte 범위를 벗어났다는 의미
		
byte num2 = -128;
System.out.println("num2 : " + num2);      //-128 : byte의 최소 저장범위
		
num2 --;
System.out.println("num2 underflow : " + num2);    //127 : byte의 최대 저장 범위
		
/* 이러한 오버 플로우와 언더플로우가 발생한다고 해서 컴파일 에러나 런타임 에러가 발생하지않는다.
* 그렇기에 최대값 혹은 최소값 범위를 고려해서 코드를 작성해야 한다. */
		
/* 일반적으로 많이 사용하는 int 값의 최대값은 대략 21억 정도이다.
 * 이 범위를 벗어난 계산은 오버플로우를 발생시켜서 원하지 않는 결과값이 나오게 될 수 있다.
 *  */
		
int firstNum = 1000000;        //100만
int secondNum = 700000;        //70만
		
int multi = firstNum * secondNum;      //7천억이 나와야 함
		
System.out.println("firstNum * secondNum = " + multi);
//firstNum * secondNum = -79669248    
//실제로 콘솔창에 출력된 값 

		
/* 이런 현상이 발생해도 그냥 넘기는 경우가 발생할 수 있다.
* 이런 경우를 논리적 에러라고 표현한다. (디버깅시 가장 힘든 이유중 한가지)
*/
		
/* 해결방법 */
/* 오버플로우를 예측하고 더 큰 자료형으로 결과값을 받아서 처리한다. 
 * */
		
long longMulti = firstNum * secondNum; 
		
System.out.println("longMulti = " + longMulti);
		
/* 이미 오버플로우 처리 된 결과를 가지고 변수에 담기 때문에 int와 long의 결과 차이가 없다.
	* 그렇다면 계산이 처리 되기 전에 long타입으로 자료형을 변경해주어야 한다. (강제형변환 이용) 
	* */
		
//정정된 코드
long result = (long) firstNum * (long) secondNum;
System.out.println("result : " + result);
// 정상적으로 7천억이 출력된다.

 

오버플로우와 언더플로우라는 논리적 오류가 발생할 수 있으므로 어떤 변수의 데이터 타입이 필요한지 값의 범위를 고려한뒤 유의하며 코드를 작성해야 한다.

 

 

 

 

 

변수를 사용할때 주의해야하는 점들 2

형변환 (casting)
  • - 값(Data)의 자료형을 바꾸는 것 (boolean 제외)
  • - 컴퓨터의 값 처리 원칙 : 
같은 종류 자료형만 대입 가능
같은 종류 자료형만 계산 가능
계산의 결과도 같은 종류의 값이 나와야 함
  • ☞ 이러한 원칙이 지켜지지 않은 경우에 형 변환이 필요함

 

  • 즉, 형변환이 왜 필요한가? 에 이러한 답변이 됨 
컴퓨터는 같은 종류의 자료형 끼리만 대입을 할 수 있으며, 같은 종류의 자료형 끼리만 계산할 수 있으며, 계산의 결과도 같은 종류의 값만 나와야 한다는 원칙때문에 다른 타입의 형태들을 통일하는 과정이 필요함

 

  • 형변환 예시
123456789 (int) → 123456789.0 (double)
'A' (char) → 65 (int)
3.14f (float) → 3 (int) 
  • 형변환 하고자 하는 값과 자료형의 표현 범위 차이에 따라 형변환 방법이 나뉨 (자동 형변환, 강제 형변환)

 

 

 

 

 

자동 형변환

컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환
  • 자바는 같은 데이터 타입끼리만 연산을 수행하기 때문이다.
1byte   2byte   4byte   8byte   4byte   8byte
byte short int long float double
    char              

 

< 데이터 형변환 >
/* 데이터 형변환이 필요한 이유
 * 자바에서 다른 타입끼리의 연산은 피연산자들이 모두 같은 타입인 경우 실행할 수 있다.
 * 즉, 같은 데이터 타입 끼리만 연산을 수행할 수 있다. */
		
/* 1. 자동형변환 규칙 테스트 */
/* 1-1. 작은 자료형에서 큰 자료형으로는 자동 형변환 된다. */
/* 작은 자료형에서 큰 자료형으로 공간만 옮기는 경우 데이터 손실이 발생하지 않기 때문에 컴파일러가 자동으로 처리해준다. */
/* 1-1-1. 정수끼리의 자동 형변환 */
/* 점점 더 큰 자료형으로 데이터를 옮겨도 문제 없이 자동 형변환 처리된다. */
		
byte bnum =  1;
short snum = bnum;
int inum = snum;
long lnum = inum;
// 컴파일러가 자동으로 처리해주기 때문에 컴파일 에러가 뜨지않는다.
		
		
/* 연산시에도 자동으로 큰 쪽 자료형에 맞춰서 계산한다. */
int num1 = 10;
long num2 = 20;
		
// int result = num1 + num2;
//컴파일 에러 메세지
// Type mismatch: cannot convert from long to int
// 자동으로 큰 쪽 자료형인 long 으로 변경 하여 계산되기 때문에 int형 변수에 담을 수 없다. 
		
long result1 = num1 + num2;
// int + long은 서로 다른 자료형이라 데이터 손실이 발생하지 않는 한 int ->long 변환을 자동 수행 후 연산한다. 
		
System.out.println("result1 : " + result1);    //정상 수행
		
		
/* 1-1-2. 실수끼리의 자동 형변환 */
float fnum = 4.0f;
double dnum = fnum;
		
		
/* 연산 시에도 자동으로 큰 쪽 자료형에 맞춰서 계산한다. */
//float result2 = fnum + dnum;
//double을 float 형 변수에 담을 수 없다.
double result2 = fnum + dnum;
		
System.out.println("result2 : " + result2);
/* 1-2. 정수는 실수로 자동 형변환 된다. */
/* 정수를 실수로 변경할 때 소수점 자리수가 없어도 실수 형태로 표현 가능하다. 
* 이 때 데이터 손실이 없기 때문에 자동 형변환이 가능하다.
 * 정수는 실제 값을 저장하는 매커니즘을 가진 것과 달리 실수는 지수부와 가수부를 따로 나눠서 작성하기 때문에
 * 바이트 크기보다 훨씬 더 많은 값을 표현할 수 있다.  */
		
long eight = 8;
float four = eight;
		
System.out.println("four : " + four);
		
		
/* 따라서 실수와 정수의 연산은 실수로 연산 결과가 반환된다. */
float result3 = eight + four;
		
System.out.println("result3 : " + result3);
		
		
/* 1-3. 문자형은 int형으로 자동 형변환 된다. */
char ch1 = 'a';
int charNumber = ch1;
		
System.out.println("charNumber : " + charNumber);
		
		
/* char가 가지는 범위 안의 정수는 char형 변수에 기록 가능하다. */
char ch2 = 65;
System.out.println("ch2 : " + ch2);
		
		
/* 1-4. 논리형은 형변환 규칙에서 제외된다. */
/* 어느 자료형이든 boolean을 형변환해서 담을 수 없다. */
		
boolean isTrue = true;
//byte b = isTrue;
//short s = isTrue;
//int i = isTrue;
//long l = isTrue;
//char c = isTrue;
//float f = isTrue;
//double d = isTrue;

 

 

 

강제 형변환

값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환
  • 강제 형변환 시 데이터 손실이 발생할 수 있음
    -> 데이터의 변형, 손실을 감수하고 강제 변환
  • 캐스트 연산자를 이용하여 형변환 한다. ex: (바꿀자료형) 값; 
int num = 290;
byte num2 = (byte) num;

 

/* 강제형변환 */
/* 바꾸려는 자료형으로 캐스트 연산자를 이용하여 형변환한다. */
/* 예) (바꿀자료형) 값; 
 * */
		
/* 자동형변환 규칙의 반대 상황에서 강제 형변환이 필요하다. */
/* 1-1. 큰 자료형에서 작은 자료형으로 변경 시 강제 형변환이 필요하다. */
/* 1-1-1. 정수끼리의 강제 형변환 */
long lnum = 8L;
//int inum = lnum;      //데이터 손실 가능성을 컴파일러가 알려준다. (에러발생)
int inum = (int)lnum;   // 변경하려는 자료형을 명시하여 강제형변환을 해야 함
short snum = (short) inum;
byte bnum = (byte) snum;
		
		
/* 1-1-2. 실수끼리의 강제 형변환 */
double dnum = 8.0;
// float fnum = dnum;   //데이터 손실 가능성을 컴파일러가 알려준다. (에러발생)
float fnum = (float) dnum;
		
		
		
/* 1-2. 실수를 정수로 변경시 강제 형변환이 필요하다. */
float fnum2 = 4.0f;
long lnum2 = (long) fnum2; //데이터 손실 가능성을 컴파일러가 알려준다. (에러발생)
// float는 4byte, long은 8byte 임에도 자동형변환 불가능 (소수점 자리 이하 데이터 손실 가능성)
		
		
		
/* 1-3. 문자형은 int 미만 크기의 변수에 저장할 떄 강제 형변환이 필요하다. */
char ch = 'a';
byte bnum2 = (byte) ch;
short snum2 = (short) ch; // 같은 2byte 인데 왜 강제 형변환을 해야할까? 
//답은 부호비트 (sign bit) 로 인한 값의 범위가 다르기 때문이다.
		
		
/* 1-4. 논리형은 강제 형변환 규칙에서도 제외된다. */
/* 강제형변환을 해도 전부 에러난다. */
boolean isTrue = true;
// byte b = (byte) isTrue;

 

/* 자동형변환과 강제형변환을 이용한 다른 자료형끼리의 연산 */
/* 다른 자료형 끼리의 연산은 큰 자료형으로 자동 형변환 후 연산 처리 된다. */

int inum = 10;
long lnum = 100;
		
		
/* 방법1. 두 수의 연산결과를 int형으로 변환 후 int 자료형 변수에 리턴받는다. */
	int isum = (int) (inum + lnum);
		
/* 방법2. long형 값을 int로 강제 형변환 한다. */
	int isum2 = inum + (int) lnum;
		
/* 방법3. 결과 값을 long형 자료형으로 받는다(자동 형변환 이용) */
	long lsum = inum + lnum;
		
		
/* 주의! int 미만의 연산의 처리결과는 int형이다. */
	byte byteNum1 = 1;
	byte byteNum2 = 2;
	short shortNum1 = 3;
	short shortNum2 = 4;
		
	//byte result1 = byteNum1 + byteNum2;   
	int result1 = byteNum1 + byteNum2;     //byte + byte => int
	//short result2 = byteNum1 + shortNum1;
	int result2 = byteNum1 + shortNum1;    //byte + short => int
	//short result3 = shortNum1 + shortNum2;
	int result3 = shortNum1 + shortNum2;   // short + short => int

	//int미만이어도 결과는 int로 저장되기 때문에 더 작은 단위에 저장할 수 없다.

 

다른 자료형간의 연산
(1) 낮은 자료형으로 맞출 시 : 낮은 자료형으로 강제 형변환
(2) 높은 자료형으로 맞출 시 : 높은 자료형으로 자동형변환
* 단, byte와 short 자료형 값의 계산 결과는 무조건 int로 처리

 

 

 

 

 

형변환 사용시 유의할 점

데이터 손실에 유의하며 사용해야 한다. 
/* 형변환 사용 시 주의할 점 */
/* 데이터 손실에 유의해서 사용해야 한다. */


/* 1. 의도하지 않은 데이터 손실 */
int inum = 290;
byte bnum = (byte) inum;
		
System.out.println("inum : " + inum); //290 값 도출
System.out.println("bnum : " + bnum); //34 값 도출
// 비트 앞부분 손실로 예측 어려움
        
        
/* 2. 의도적인 데이터 손실 */
double height = 175.5;
int floorHeight = (int) height;
System.out.println("height : " + height);
System.out.println("fllorHeight : " + floorHeight);
// 의도적으로 소수점 절삭에 활용할 수도 있다.
  • - 개념적으로 언급했던 부분을 잘 암기하고 숙지 해 두어야 한다. 
  • - 이 부분을 잘 숙지한채로 프로그래밍에 들어가는 것이 너무나 중요

 

 

 

 

 

 

더보기

학습점검

 

✅ 리터럴과 리터럴의 종류에 대해 이해하고 설명할 수 있다.
✅ 리터럴의 연산 처리에 대해 이해할 수 있다.
✅ 문자열 처리에 대해 이해할 수 있다.
✅ 변수의 사용 목적을 이해할 수 있다.
✅ 변수를 이해하여 선언할 수 있다.
✅ 기본자료형의 byte size를 암기할 수 있다.
✅ 상수를 이해하고 선언할 수 있다.
✅ 변수와 상수의 명명규칙에 대해 이해하고 적용할 수 있다.
✅ 데이터 오버플로우에 대해 이해할 수 있다.
✅ 형변환을 해야 하는 이유에 대해 이해할 수 있다.
✅ 자동형변환이 일어나는 조건에 대해 이해할 수 있다.
✅ 강제형변환을 이해하고 적용할 수 있다.

 

 

 

 

 

산술 연산자

사칙연산과 관련 된 연산자로 가장 기본적이면서도 많이 사용되는 연산자
  • 연산에 필요한 값이나 변수가 두 개인 이항 연산자
  • 우선 순위에 따라 연산되어 결과가 산출 됨  (반드시 왼쪽에서 오른쪽의 순서가 아닐 수도 있다. )
  • 기본적인 피연산자들의 연산 방향은 왼쪽에서 오른쪽
  • num % 2 에서 나올 수 있는 경우의 수는 0과 1이 있다. 짝수라면 0으로 홀수라면 1로, 나중에 짝 홀수를 판단할 때 사용 된다. 짝/홀과 배수의 개념과 연관된다. 

 

/* 산술 연산자 */
/* 산술 연산자는 주로 사칙연산과 관련 된 연산자로 가장 기본적이면서도 많이 사용되는 연산자이다. 
* 연산자의 실행이 가능하기 위해 필요한 값이나 변수가 두개인 이항 연산자로 분류되며
* 피연산자의 연산 방향은 왼쪽에서 오른쪽이다. 
* */
		
		
		
/* 산술 연산자의 우선순위 
 * 수학의 개념과 유사하게 곱하기와 나누기 연산이 더하기와 빼기 연산보다 우선적으로 동작한다. 
 * */

int num1 = 20;
int num2 = 7;
		
System.out.println("num1 + num2 = " + (num1 + num2));   
//소괄호를 작성하지않으면 연산이 되지않고 문자열이 합쳐진다. 	

System.out.println("num1 + num2 = " + (num1 - num2));
System.out.println("num1 + num2 = " + num1 * num2);   
//곱셉은 우선순위가 우선하기 때문에 괄호로 감싸지 않아도 된다. 

System.out.println("num1 + num2 = " + (num1 / num2));
System.out.println("num1 + num2 = " + (num1 % num2));

 

 

 

 

 

복합 대입 연산자

 다른 연산자와 대입 연산자가 결합한 것
  • 자기 자신의 값과 연산 후 연산 결과를 자기 자신에게 누적 대입
  • 복합 대입 연산자 사이에 스페이스를 누르지 않도록 주의, 붙여진게 하나의 형태이다. 
  • 증감 연산과 비슷해 보이지만 증감연산자(++, —)는 1씩 증가

 

a +=10  = a = a + 10
a -=10 a = a - 10
a *=10 a = a * 10
a /=10  a = a / 10
a %=10  a = a % 10

 

/* 대입연산자와 산술 복합 대입 연산자 */
int num = 12;
System.out.println("num : " + num);
		
//3증가시
num = num + 3; // 대입연산자의 오른쪽에는 값, 왼쪽에는 값을 저장할 공간
System.out.println("num : " + num);   //15
		
num += 3;   // num = num + 3; 과 같은 의미
System.out.println("num : " + num);   //18
		
num -= 5;
System.out.println("num : " + num);   //13
		
num *= 2;
System.out.println("num : " + num);   //26
		
num /= 2;
System.out.println("num : " + num);   //13
		 
		
/* 주의! 산술 복합 대입연산자의 작성 순서에 주의해야한다. */
/* 산술 대입 연산자가 아닌 num에 -5를 대입한다는 의미가 되는 것이다. */
//만약 복합 대입연산자의 순서를 바꿔 쓴다면?

num =- 5;
System.out.println("num : " + num);   //-5

 

 

 

 

 

 

 

 

'Programming > JAVA' 카테고리의 다른 글

메소드  (0) 2021.12.22
연산자  (0) 2021.12.21
변수 파트 암기할 표 정리  (0) 2021.12.18
변수  (0) 2021.12.17
프로그래밍 기초  (0) 2021.12.16

 

 

자주 사용하는 이스케이프문자 정리
  • 이스케이프 문자는 문자열 내부에 역슬래시(\)가 붙은 형태로 사용된다.
  • 문자열 내부에 특정 문자를 포함시키고 싶을때 주로 사용한다

 

이스케이프 문자 출력 용도
\t 탭만큼 띄움
\n 줄 바꿈
\r 캐리지 리턴
\" "출력
\' '출력
\\ \출력
\u16진수 16진수 유니코드에 해당하는 문자출력

 

 

 

 

 

연산자의 종류
연산자 종류 연산자 피연산자 수 산출값 기능
산술 +, -, *, /, % 이항 숫자 사칙연산 및 나머지 계산
부호 +, - 단항 숫자 음수와 양수의 부호
문자열 + 이항 문자열 두 문자열을 연결
대입 =, +=, -=, *=, /=, %= 이항 다양 우변의 값을 좌변의 변수에 대입
증감 ++, -- 단항 숫자 1만큼 증가/감소
비교 ==, !=, >, <, >=, <=, instanceof 이항 boolean 값의 비교
논리 !, &, |, &&, || 단항 이항 boolean 논리부정, 논리곱, 논리합
조건 (조건식) ? A : B 삼항 다양 조건식에 따라 A또는 B중 하나 선택

 

 

 

 

 

연산자의 연산방향과 우선순위
연산자 연산방향 우선순위
증감(++,--), 부호(+,-), 논리(!) 높음
산술(*. /, %)
산술(+, -)
비교(>, <, >=, <=, instanceof)
비교(==, !=)
논리(&)
논리(^)
논리(|)
논리(&&)
논리(||)
조건(?:)
대입(=, +=, -=, *=, /=, %=) 낮음

 

 

 

 

 

 

 

 

 

 

 

'Programming > JAVA' 카테고리의 다른 글

메소드  (0) 2021.12.22
연산자  (0) 2021.12.21
변수와 리터럴  (0) 2021.12.20
변수  (0) 2021.12.17
프로그래밍 기초  (0) 2021.12.16




출력메소드


System.out.print( )
( ) 안의 변수, 문자, 숫자, 논리 값을 모니터에 출력해주는 메소드

System.out.println()
print문과 동일하게 출력은 해주지만 출력 후 자동으로 출력창에 줄바꿈(개행)을 해주는 메소드
  • 소괄호안에 입력한 변수,숫자,문자값을 창에 출력해준다.
  • 두가지의 차이는 개행(줄바꿈)의 여부에 있다.

 

System.out.println(1.23);

 

리터럴이란? literal


프로그래밍 언어에서 미리 정의해놓은 값의 형태를 말한다.
  • 리터럴의 종류에 따라 사용할 수 있는 연산자가 다르다.

 

리터럴의 종류
  1. 숫자 : 정수, 실수
  2. 문자 : 하나의 문자만 의미 ex: 'C' (작은따옴표)
  3. 문자열 : 두개이상 문자들의 연속을 의미 ex: "안녕하세요" (큰따옴표)
  4. 논리 : true or false를 의미
<여러 가지 값의 형태를 출력> 
/* 1. 숫자 형태의 값 */ 
/* 1-1. 정수 형태의 값 출력 */ 
System.out.println(123); 

/* 2-2. 실수 형태의 값 출력 */ 
System.out.println(1.23); 

/* 2. 문자 형태의 값 출력 */ 
System.out.println('a'); 

//System.out.println('ab'); 
//System.out.println(''); 

System.out.println('1');
  • 문자 형태의 값은 홑따옴표(single-quotation)으로 감싸주어야 한다.
  • 두 개 이상은 문자로 취급하지 않기 때문에 에러가 발생한다.
  • 아무 문자도 기록되지 않은 경우도 에러가 발생한다.
  • 숫자 값 이지만 홑따옴표로 감싸져 있는 경우 문자 '1'이라고 판단한다.
  • ( ) 괄호속에 그냥 숫자만 쓴다면, 수로 인식된다.

 

/* 3. 문자열 형태의 값 출력 */ 
System.out.println("안녕하세요"); 
System.out.println("123"); 
System.out.println(" "); 
System.out.println("a");

- 문자열은 문자 여러 개가 나열된 형태를 말하며 쌍따옴표(double-quotation)으로 감싸주어야 한다.
- 쌍따옴표로 감싸져있는 정수는 문자열로 보아야 한다.
- 아무 값도 없는 빈칸을 감싼 쌍따옴표도 문자열로 취급한다.
- 한 개의 문자로 쌍따옴표로 감싸면 문자열이다. (문자 'a'와 문자열 "a"는 다르다)

/* 4. 논리 형태의 값 출력 */ 
System.out.println(true); 
System.out.println(false);

- true 혹은 false 값을 논리형이라고 한다.




연산


리터럴 종류 별로 사용 불가능한 산술 연산이 존재하기 때문에 에러에 주의해야 한다.

연산자 종류와 사용의 예시)

+/- / *
% 123 / 10 "helloworld" + 123
'a' + 'b‘ true + "a“ false / "a"(ERROR)
  • % 모듈러=모드 : 나눈후의 나머지
  • / : 남은 값의 몫

 

* 1. 숫자와 숫자의 연산 */ 
/* 1-1. 정수와 정수의 연산 */ 
System.out.println(123 + 456); 
System.out.println(123 - 23); 
System.out.println(123 * 10); 
System.out.println(123 / 10); 
System.out.println(123 % 10); 

/* 1-2. 실수와 실수의 연산 */ 
System.out.println(1.23 + 1.23); 
System.out.println(1.23 - 0.23); 
System.out.println(1.23 * 10.0); 
System.out.println(1.23 / 10.0); 
System.out.println(1.23 % 1.0); 
//약간의 오차가 생긴다 

/* 1-3. 정수와 실수의 연산 */ 
// 정수와 실수 연산의 결과는 항상 실수가 나온다. 

System.out.println(123 + 0.5); 
System.out.println(123 - 0.5); 
System.out.println(123 * 0.5); 
System.out.println(123 / 0.5); 
System.out.println(123 % 0.5); 

2. 문자의 연산 

/* 2-1. 문자와 문자의 연산 */ 
System.out.println('a' + 'b'); 
System.out.println('a' - 'b'); 
System.out.println('a' * 'b'); 
System.out.println('a' / 'b'); 
System.out.println('a' % 'b'); 

/* 2-2. 문자와 정수의 연산 */ 
문자 'a'는 숫자 97과 같다는 것을 알 수 있다. 
컴퓨터는 문자를 인식하지 못하고 숫자로만 인식할 수 있기 때문에, 
모든 문자에 대응되는 숫자들이 매칭이 되어 있다. (아스키코드표 참조) 

System.out.println('a' + 1); 
System.out.println('a' - 1); 
System.out.println('a' * 2); 
System.out.println('a' / 2); 
System.out.println('a' % 2); 

/* 2-3. 문자와 실수의 연산 */ 
실수도 숫자이기 때문에 정수의 연산처럼 모든 연산이 가능하다. 
단, 결과는 실수 형태로 나오게 된다. 

System.out.println('a' + 1.0); 
System.out.println('a' - 1.0); 
System.out.println('a' * 2.0); 
System.out.println('a' / 2.0); 
System.out.println('a' % 2.0); 

결론 : 문자는 내부적으로 숫자로 취급된다. 
지금까지의 연산은 숫자끼리의 연산으로 숫자(정수 또는 실수) 
형태의 값은 수학의 사칙연산과 mod 연산이 전부 가능하다.

 

  • 문자와 실수의 연산의 결과는 '실수값'이 나온다.
  • 문자는 내부적으로 특정한 정수값을 가진 숫자 취급을 받는다.
  • 그러므로 문자와 수의 연산은 결과적으로 수의 연산이 된다.
  • 실수와 실수의 모듈(%)은 결과값이 깔끔하게 정수로 떨어지지 않는다. 이는 컴퓨터가 실수를 나누는 방식을 다른 연산자와 다른 방식을 취하기 때문이다.
  • 숫자 1과 문자'1'은 다르다. 이는 컴퓨터가 문자를 아는게 아니라 각각에 대응되는 특정값, 즉 아스키 코드 ASCII 가 적용되기 때문이다. 즉 문자를 특정 숫자 값으로 인식한다. 아스키 코드는 그 수가 한정적이며 국제적으로 약속된 표준 표기법은 유니코드를 통해 좀 더 많은 값으로의 확장이 가능하다.





문자열 연산


문자열 표현이란?
  • 리터럴 값인 문자들의 나열이 문자열
  • Java에서는 “”로 묶여 있는 값을 문자열로 인식

 

문자열을 포함한 연산
  • “기차“
  • “기차“ + "칙칙폭폭“
  • “기차“ + 123 + 45 + "출발“ = 기차12345출발
  • 123 + 45 + "기차" + “출발"= 168기차출발

- 연산의 순서는 왼쪽에서 오른쪽으로 이동한다.
- 문자에 홑따옴표(' ')가 없다면 컴파일 오류가 뜬다.
- 두개 이상의 문자에 홀따옴표를 두르면 컴파일 오류가 뜬다.
- 홑따옴표 내 아무것도 작성되지않는다면 컴파일 오류가 뜬다.
- '1'과 1은 다르게 생각되어야 한다. '1'은 문자 1이지만 1은 숫자 1이다.

- 문자열은 쌍따옴표(" ")로 감싸져야 한다.
- 숫자여도 쌍따옴표 내에 작성되면 문자열로 인식된다.
- 쌍따옴표 내에 아무것도 작성되지 않는다해도 문자열로 인식된다.
- 만일 System.error.println("a") 등으로 출력문을 잘못입력한다면 출력문에 빨간 글자가 뜬다.
- 문자 'a' 와 문자열 "a" 는 다르게 인식된다.

3. 문자열의 연산 

/* 3-1. 문자열과 문자열의 연산 */ 

System.out.println("hello" + "world"); 

//System.out.println("hello" - "world"); 
//System.out.println("hello" * "world"); 
//System.out.println("hello" / "world"); 
//System.out.println("hello" % "world");
  • - 문자열과 문자열의 '+' 연산 결과: 문자열 합치기(이어 붙이기)가 된다.
  • - 문자열은 '+' 연산 외에 다른 연산을 사용할 수 없다.
  • + 외의 다른 사칙 연산은 사용하지 못하며 적용할 경우 오류가 난다.

 

문자열과 다른 형태의 연산
  • 문자열이 붙으면 결과적으로 모두 문자 취급이 되어 이어 붙여진 결과값이 나온다.
< 3-2.문자열과 다른 형태의 값 연산 > 

/* 문자열과의 연산은 '+' 연산만 가능하다. */ 
/* 연산 결과는 다른 형태의 값들도 문자열로 취급하여 
문자열 합치기(이어 붙이기) 결과가 나오게 된다. */ 


/* 3-2-1. 문자열과 정수의 연산 */ 
System.out.println("helloworld" + 123); 

/* 3-2-2. 문자열과 실수의 연산 */ 
System.out.println("helloworld" + 123.456); 

/* 3-2-3. 문자열과 문자의 연산 */ 
System.out.println("helloworld" + 'a'); 

/* 3-2-4. 문자열과 논리값의 연산 */ 
System.out.println("helloworld" + true); 


/* 주의 : 숫자로 된 문자열 형태의 값은 '+' 연산의 결과가 
문자열 합치기 결과가 되는 것에 주의하자. */ 

System.out.println("123" + "456");

 

/* 두개의 문자열 합치기 */ 

System.out.println(9 + 9); //18 
System.out.println("9" + 9); //99 
System.out.println(9 + "9"); //99 
System.out.println("9" + "9"); //99 


/* 세개의 문자열 합치기 */ 

System.out.println(9 + 9 + "9"); //189 
// '+'의 연산 방향은 왼쪽에서 오른쪽이다 (숫자부터 합쳐짐) 

System.out.println(9 + "9" + 9); //999 
// 왼쪽의 연산부터 수행하고 수행 결과를 오른쪽과 연산함 

System.out.println("9" + 9 + 9); //999 

/* 바로 위에서 문자열 합치기 한 999 결과를 918로 
변경(숫자 연산을 먼저 실행)하고 싶다면?? */ 
/* 괄호 기호를 이용해 숫자 연산을 묶어주게 되면 
괄호 안에 있는 연산을 우선 수행한다. */ 

System.out.println("9" + (9 + 9)); //918 


/* 문자열 합치기 응용 */ 
/* 10과 20의 사칙연산 결과를 출력하세요 */ 

System.out.println("========== 10과 20의 사칙연산 결과 =========="); 
System.out.println(10 + 20); 
System.out.println(10 - 20); 
System.out.println(10 * 20); 
System.out.println(10 / 20); 
System.out.println(10 % 20); 


/* 결과는 맞게 출력 되지만 무슨 결과인지 구분하기 어려우므로 
문자열 합치기 기능을 이용하여 변경해보자 */


/* 10과 20의 사칙연산 결과 보기 좋게 출력 */ 

System.out.println("10과 20의 합 : " + (10 + 20)); 
// 주의 : 괄호를 묶지 않으면 문자열 합치기가 일어나 결과가 1020이 된다. 

System.out.println("10과 20의 차 : " + (10 - 20)); 
// 문자열은 마이너스 연산이 불가능하기에 앞에서 생성 된 
문자열과 마이너스 연산이 불가하다. (반드시 괄호 사용) 

System.out.println("10과 20의 곱 : " + (10 * 20)); 
// *,/,%는 +,-보다 우선순위가 높음 


System.out.println("10과 20을 나누기 한 몫 : " + (10 / 20)); 
System.out.println("10과 20을 나누기 한 나머지 : " + (10 % 20));



 

 

논리값 연산
  • 논리형태 : 맞다 틀리다를 나타내는 부분
  • 논리값은 사칙 연산이 불가능하며 연산시 컴파일 오류가 뜬다.
  • 논리 + 문자 = 오류
  • 연산 중 문자열을 만나면 모두 문자열 화되기 때문에 4-6의 논리와 문자열의 연산은 truea라는 값을 도출한다.
< 4. 논리값 연산 > 

/* 4-1. 논리값과 논리값 연산 */ 
/* 논리값끼리의 연산은 모든 연산자 사용이 불가능하다. */ 

//System.out.println(true + false); 
//System.out.println(true - false); 
//System.out.println(true * false); 
//System.out.println(true / false); 
//System.out.println(true % false); 


/* 4-2. 논리값과 정수의 연산 */ 
/* 논리값과 정수의 연산은 모든 연산자 사용이 불가능하다. */ 
//System.out.println(true + 1); 
//System.out.println(true - 1); 
//System.out.println(true * 1); 
//System.out.println(true / 1); 
//System.out.println(true % 1); 


/* 4-3. 논리값과 실수의 연산 */ 
/* 논리값과 실수의 연산은 모든 연산자 사용이 불가능하다. */ 

/* 4-4. 논리값과 문자의 연산 */ 
/* 논리값과 문자의 연산은 모든 연산자 사용이 불가능하다. */
/* 이유는, 문자는 내부적으로 숫자 취급을 하기 때문에 
결국 논리값과 숫자의 연산과 동일한 의미가 되기 때문이다. */ 


/* 4-5. 논리값과 문자열의 연산 */ 
/* 논리값과 문자열의 연산은 '+' 연산자만 사용 가능하다. */ 
/* 이유는, 위에서 테스트 해 본 문자열 합치기가 되는 원리와 동일하다. */ 

/* 4-6. 논리와 문자열의 연산 */ 
System.out.println(true + "a");


// truea



연산의 순서는 왼쪽에서 오른쪽으로 이루어진다.
이때 이러한 방향성보다 우선하고싶은 연산이 있다면 괄호처리 ( ) 해주면 된다.
또한 사칙연산에는 순서가 있다. 더하기 빼기보다 *, /, % 등이 우선한다.




변수


메모리(RAM)에 시간에 따라 변하는 값을 기록하기 위한 '공간'
  • 변하는 값이라는 의미도 있지만 값을 저장하는 '공간'으로 볼 수도 있다.
  • 연산하여 결과를 출력했으면 변수에 저장할 수 있다. 이 때 출력코드에 변수를 입력하면 저장한 값이 나온다.
  • 길고 복잡한 수식을 가진 연산값이라면 변수에 대입해 코드를 단순화할 수 있다.
  • 값에 의미를 부여하는 것의 이점: 코드 의미 파악 용이하고 재사용성 증가로 인한 유지보수성이 증가한다.
  • 좋은 코드는 재사용성이 좋은 코드이다. 유지보수 범위의 파악이 가능해야 한다.





자료형(Type)


- 데이터의 크기와 형태에 맞게 여러가지 형태의 자료형이 존재 함

- 논리형 : boolean (1byte) - 1과 0 즉 true false 로 이루어져 있다.
- 문자형 : char (2byte) / String (참조형)
- 숫자 / 정수형 : byte (1byte) / short (2byte) / int (4byte) / long (8byte)
- 숫자 / 실수형 : float (4byte) / double (8byte)

  구분 형태 표현식 크기
자료형 논리   boolean 1byte
문자 문자 char 1byte
문자열 String 참조형
숫자 정수형 byte 1byte
short 1byte
int 1byte
long 1byte
실수형 float 1byte
double 1byte

 

  • 문자열은 기본자료형에 해당하지 않는다.
  • 문자는 홑따옴표, 문자열은 쌍따옴표를 이용해서 표현을 한다.
  • 기본자료형은 int 와 double이며 몇가지 표기에 유의해야 한다.

 

long자료형을 표현할 때는 L을 붙여 표현한다.
long lnum;
lnum = 8L;

float를 표현할때는 f를 붙여서 표현한다.
float fnum;
fnum = 4.0f;
  • 소문자로 'l'을 써도 되지만 글꼴에 따라 숫자 1과 혼선이 빚어질 수 있어 대문자로 하는 것이 권장된다.
  • 대문자 'F'도 가능하지만 소문자를 사용하는 것이 일반적이다.





데이터 저장 단위


저장 공간이 제한적이기 때문에 저장 크기에 대한 기준과 CPU가 데이터를 처리할 때 일정한 기준 필요하다.
  • 비트(bit) : 컴퓨터가 나타내는 데이터의 저장 최소 단위로서 2진수 값 하나를 저장할 수 있는 메모리 공간을 의미
  • 바이트(byte) : 데이터 처리 또는 문자의 최소 단위로서 8개의 비트가 모여 하나의 바이트가 구성 됨
  • 8 비트 = 1바이트 / 16비트 = 2바이트
  • 공간이 커질 수록 표현할 수 있는 값의 범위가 늘어난다는 의미이다.
  • 컴퓨터는 2진수로 인지하기 때문에 2^n(n = 비트 크기)로 범위 할당한다.
  • 실수형은 부동소수형방식을 쓰기때문에 정수의 저장방식과는 차이가 있다.
  • double은 표현할 수 있는 유효자리 수가 float의 2배이다.



 

 

변수의 선언


변수를 선언한다는 것은 메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것
  •  선언 방법 : 자료형(변수타입) + 변수명;
  • 선언 예시 : boolean isTrue; byte bnum; int inum; String str;
  • 변수 저장소의 크기는 타입을 지정함으로서 결정할 수 있다.
  • 문자열은 참조형으로서, 기본자료형에 해당하지 않는다.
  • char은 ' ' 으로, String 에는 " " 으로 작성해야한다.

 

/* 변수를 사용하기 위한 방법
* 1. 변수를 준비한다.(선언) 
* 2. 변수에 값을 대입한다.(값 대입 및 초기화) 
* 3. 변수를 사용한다. */ 



/* 1. 변수를 준비한다.(선언) */ 
/* 1-1. 변수를 선언하는 방법 */ 
/* 자료형 변수명; */ 
/* 자료형이란? * 
다양한 값의 형태별로 어느 정도 크기를 하나의 값으로 
취급할 것인지 미리 Compiler와 약속한 키워드이다. 
* 이러한 자료형은 기본자료형(Primary type)과 
참조자료형(Reference type)으로 나누어진다. 
* 그 중 기본자료형 8가지부터 살펴보기로 한다. */ 


/* 1-1-1. 숫자를 취급하는 자료형 */ 
/* 정수를 취급하는 자료형은 4가지가 있다. */ 

byte bnum; //1byte 
short snum; //2byte 
int inum; //4byte 
long lnum; //8byte 


/* 실수를 취급하는 자료형은 2가지가 있다. */ 

float fnum; //4byte 
double dnum; //8byte


/* 1-1-2. 문자를 취급하는 자료형 */ 
/* 문자를 취급하는 자료형은 한 가지가 있다. */ 
char ch; //2byte 


/* 1-1-3. 논리 값을 취급하는 자료형 */ 
boolean isTrue; //1byte 

/* 이상 8가지를 기본자료형이라고 한다. */ 
/* 앞에서 다뤄본 형태 중 문자열이 빠져 있다. 
문자열은 조금 다른 방식으로 취급하게 되는데 
이 부분은 나중에 깊게 다룰 것이다. */ 


/* 1-1-4. 문자열을 취급하는 자료형 */ 
String str; //4byte 
(엄밀히 이야기 하면 주소값은 4byte 정수형이다.) 


/* 2. 변수에 값을 대입한다.(값 대입 및 초기화) */ 
/* 위에서 한 변수 선언은 메모리에 값을 저장하기 위해 공간만 생성해 둔 상태이다. 
* 그 공간에 대입연산자를 이용하여 자료형에 저장하기로 한 형태의 값을 저장할 수 있다. 
* 만약, 약속 내용과 다른 형태의 값을 대입하려고 하면 Compiler는 에러를 발생시킨다. * 
* 대입 연산자의 실행 방향은 오른쪽에서 왼쪽이다. 
* 즉, 오른쪽에 있는 값을 왼쪽의 공간에 대입한다는 의미이며, 
왼쪽에는 항상 공간, 오른쪽에는 항상 값이 온다. 
* 변수를 대입연산자 왼쪽에 사용하면 공간의 의미이고, 
대입연산자 오른쪽에 사용하면 변수가 가진 값을 의미한다. */ 


/* 2-1. 정수를 취급하는 자료형에 값 대입 */ 
bnum = 1; 
snum = 2; 
inum = 4; 
//lnum = 8; 
//아무 문제 없는 것 같지만 사실 뒤에 대문자 L을 붙여야 한다. 
그 이유는 뒤에 형변환에서 다루게 될 것이다. 

lnum = 8L; //소문자로 'l'을 써도 되지만 글꼴에 따라 
숫자 1과 혼선이 빚어질 수 있어 대문자로 하는 것이 권장이다. 



/* 2-2. 실수를 취급하는 자료형에 값 대입 */ 
//fnum = 4.0; fnum = 4.0f; 
//실수 뒤에 'f'를 붙여야 한다. 
대문자 'F'도 가능하지만 소문자를 사용하는 것이 일반적이다. 

dnum = 8.0; 


/* 2-3. 문자를 취급하는 자료형에 값 대입 */ 
ch = 'a'; 
ch = 97; 
//'a'는 97이라는 숫자 값을 가지므로 숫자로도 char에 저장 가능하다. 


/* 2-4. 논리를 취급하는 자료형에 값 대입 */ 
isTrue = true; 
isTrue = false; 
// true 혹은 false 중 한 가지의 값만 사용 가능하다. 


/* 2-5. 문자열을 취급하는 자료형에 값 대입 */ 
str = "a"; 


/* 일반적으로 사용하는 값을 독특한 형태가 아닌 일반적인 
형태로 사용할 수 있는 자료형을 대표자료형이라고 하며 
* 정수형은 int, 실수형은 double이 대표 자료형이다. 
* 정수의 경우 일상 생활에서 많이 사용되는 숫자의 범위는 
byte, short로는 표현이 불가능한 경우가 많아 
* 특수한 경우가 아니면 byte와 short는 잘 사용하지 않는다. 
* 실수의 경우 정확도를 기준으로 4byte 자료형보다 
8byte 자료형이 더 정확한 실수를 표현할 수 있기 때문에 
* double을 대표 자료형으로 사용하고 float는 특수한 목적이 있는 
경우에만 사용하게 된다. * */ 


/* 위처럼 변수를 선언하고 난 뒤 최초로 값이 대입되는 것을 초기화라고 한다. 
* 위에서는 변수 선언과 값 대입을 따로 했지만 동시에 수행할 수 도 있다. 
* 이를 '선언과 동시에 초기화' 라고 한다. * */ 

int point = 100; 
int bonus = 10; 



/* 3. 변수를 사용한다. */ 
/* 3-1. 변수에 저장한 값 출력하기 */ 
System.out.println("============ 변수에 저장 된 값 출력 ============="); 
System.out.println("bnum의 값 : " + bnum); 
System.out.println("snum의 값 : " + snum); 
System.out.println("inum의 값 : " + inum); 
System.out.println("lnum의 값 : " + lnum); 
System.out.println("fnum의 값 : " + fnum); 
System.out.println("dnum의 값 : " + dnum); 
System.out.println("ch의 값 : " + ch); 
System.out.println("isTrue의 값 : " + isTrue); 
System.out.println("str의 값 : " + str); 



/* 3-2. 변수를 이용해서 연산하기 */ 
/* 변수에 저장 된 값을 이용해서 연산을 할 수도 있다. */ 
System.out.println("포인트와 보너스의 합은 ? " + (point + bonus)); 



/* 3-3. 대입 연산자의 왼쪽과 오른쪽편에 사용하기 */ 
/* 대입연산자의 왼편에는 공간이라는 의미, 오른편에는 값이라는 의미가 있다. 
* 따라서 point라는 공간에 point가 가지고 있는 값 + 100한 값을 대입하라는 의미이다. 
*/ point = point + 100; 

System.out.println("point = point + 100 ? " + point);




값 대입과 리터럴


  • 변수에 값 대입 : 생성한 변수(저장 공간)에 값을 저장 하는 것
  • 변수는 한 개의 데이터만 보관하며, 마지막에 대입한 값을 저장하고 있다.
/* 변수의 사용 목적 */ 
/* 1. 값에 의미를 부여하기 위한 목적 
(의미 전달이 쉬워야 코드를 읽기 쉬워지고, 협업 및 유지보수에 유리하기 때문이다.) 

* 2. 한 번 저장해둔 값을 재사용 하기 위한 목적
(변수를 이용하여 코드를 작성하면, 값을 변경할 때도 보다 간편하게 변경할 수 있다.) 

* 3. 시간에 따라 변하는 값을 저장하고 사용할 수 있다. 
(변하는 값을 저장하기 위한 공간이다) */ 




/* 1. 값에 의미를 부여하기 위한 목적 */ 

System.out.println("=========== 값에 의미 부여 테스트 ==============="); 

/* 아래처럼 작성하면 어느 값이 급여인지 어느 값이 보너스 금액인지 알수 없다. */ 
System.out.println("보너스를 포함한 급여 : " + (1000000 + 200000) + "원"); 

/* 아래처럼 의미를 부여하게 되면 어느 값이 급여인지, 
보너스 금액인지 명확하게 알 수 있게 한다. */ 

int salary = 1000000; 
int bonus = 200000; 
System.out.println("보너스를 포함한 급여 : " + (salary + bonus) + "원"); 


/* 2. 한 번 저장해둔 값을 재사용하기 위한 목적 */ 
System.out.println("=========== 변수에 저장한 값 재사용 테스트 ============="); 
/* 10명의 고객에게 100 포인트를 지급해주는 내용을 출력하도록 작성해보자 */ 

System.out.println("1번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("2번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("3번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("4번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("5번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("6번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("7번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("8번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("9번 고객에게 포인트를 100포인트 지급하였습니다."); 
System.out.println("10번 고객에게 포인트를 100포인트 지급하였습니다."); 

/* 위 코드에서 공통적으로 사용된 100이라고 하는 값을 변수에 넣고 변수를 호출하여 
코드를 개선해보자 */ 

int point = 200; 
System.out.println("1번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("2번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("3번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("4번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("5번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("6번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("7번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("8번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("9번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 
System.out.println("10번 고객에게 포인트를 " + point + "포인트 지급하였습니다."); 

/* 지급해야 하는 포인트가 변경 된다면 위의 코드는 10줄을 변경해야 하지만 아래 
코드는 변수에 대입한 값만 변경하면 적용이 된다. */ 


/* 3. 시간에 따라서 변경되는 값을 저장하고 사용할 수 있다. */ 
System.out.println("============ 변수에 저장 된 값 변경 테스트 ================"); 

/* 변수는 하나의 값을 저장하고 사용하기 위한 공간이기 보다, 
변하는 값을 저장하기 위한 공간이다. */ 

int sum = 0; 
sum = sum + 10; 

System.out.println("sum에 10을 더하면 현재 sum의 값은? " + sum); 
sum = sum + 10; 

System.out.println("sum에 10이 있었는데 10을 추가로 더하면? " + sum); 
sum = sum + 10; System.out.println("sum에 20이 있었는데 10을 추가로 더하면? " + sum);





변수의 초기화


변수를 선언한 이후 처음으로 값을 저장하는 것을 의미
/* 선언 후 초기화 */ int age; age = 100; /* 선언과 동시에 초기화 */ int age = 100;

 

지역변수는 선언 후 호출을 하기 전에 반드시 초기화가 되어 있어야 한다.
/* 잘못된 예시 */ 

int age; 
System.out.println(age); 

// 이 경우 컴파일 에러가 발생한다. 호출이전에 값 초기화가 되어야 한다.





(+) 이클립스 사용


  • package는 일종의 폴더 개념으로 생각하자.
  • 패키지는 '세단위' 이상으로 사용하는것이 좋다. ex: chap01.exam01.run01
  • 보통 패키지 없이 클래스를 작성하지 않는다.
  • 클래스의 가장 맨 뒤엔 패키지 명이 존재한다.
  • 클래스의 풀네임은 패키지 명을 포함한 것이다.
  • 즉, 클래스를 bae01이라면 풀네임은 chap01.exam01.run01.bae01 이 된다.
  • 클래스 작성도중 패키지 경로가 훼손되지않도록 주의해야한다.
  • 이클립스 화면 내에 빨간 밑줄이 뜨는 이유? 컴파일 에러, 코드에 문법적인 오류가 있다는 의미이다.
  • 어떠한 명령어가 끝났다면 코드 뒤에 항상 ';' 세미콜론을 붙여주어야 한다.
  • { }는 클래스를 작성할 수 있는 공간이다.
  • 약속된 형태의 메인 메소드 안에서만 출력 메소드를 작성할 수 있다. 메인 메소드의 선행없이 출력메소드만 입력하면 컴파일 에러가 뜬다.
  • // 한줄주석으로서 코드로는 무시되는 기능이다. 단, 한줄만 가능하다.
  • /* */ 여러줄의 주석을 코드로서 무시되는 기능로 달 수 있다.
  • src 위 bin 엔 자동으로 컴파일된 .class 파일등이 있다. 이것은 JVM이 이해할 수 있는 형태의 파일이다.

 

메인메소드를 미리 만드는 것을 깜빡했다면?
  • 단축키 CTRL + SPACE 를 입력하면 메인 메소드가 뜬다.
System.out.println( );을 한번에 입력하고 싶다면?
  • 단축키 syso + CTRL + SPACE 를 누르면 한번에 완성된다.
이 외의 유용한 단축키
- CTRL + S : 저장
- CTRL + F11 : 출력 (단, 저장이 선행되어야한다.)
- Shift + enter : 다음줄로 이동
- Tab : 들여쓰기









'Programming > JAVA' 카테고리의 다른 글

메소드  (0) 2021.12.22
연산자  (0) 2021.12.21
변수와 리터럴  (0) 2021.12.20
변수 파트 암기할 표 정리  (0) 2021.12.18
프로그래밍 기초  (0) 2021.12.16
프로젝트를 하는경우 소스를 받아오고 내보내는 공유의 과정이 필요한데 이때 가장 기초가 되는 것이 import와 export이다. 두가지 기능을 사용하여 다른 팀원들과 소스를 주고받을 수 있다. 

 

 

export란?

- 내가 가진 파일을 외부로 내보내는 것

 

(1) 좌측 페이지에 대고 오른쪽 버튼 클릭 후 export를 누른다

(2) General 폴더에서 - Archive(압축시킨다는 의미) 를 선택한다.

(3) project 단위로 내보내야하기 때문에 모두 체크 상태가 되었는지 확인한다.

(4) 내보낼 파일 경로를 선택한 뒤 파일명을 지정한다.

(5) 마지막으로 지정 경로 속 '압축파일' 이 있는지 확인한다. 

 

import란?

-외부파일을 나의 workspace로 가져오는 것

(만일 같은 파일이 workspace에 있을 경우 동일 파일을 꺼내는 것은 불가능 하므로 Delete 시켜둘것, 체크박스 확인)

 

(1) 좌측 페이지에 대고 오른쪽 버튼 클릭한 뒤 import 클릭한다. 

(2) General을 누른 뒤 지정경로에 기존에 파일이 있을 것이므로 것이므로 Existing를 클릭한다. 

 

(2)-1. 가져오려는 파일이 압축 파일일 경우 - Select Archive 항목의 browse 를 눌러 파일을 선택한 뒤 Finish를 누른다.
(2)-2. 가져오려는 파일은 압축이 풀린 파일일 경우 - Select Root 항목에 browse로 가져온다,.

 - 이때 그냥 finish를 눌러버리면 소스가 workspace에 옮겨지지 않는다.

 - 반드시 [Copy project into workspace] 항목에 체크한뒤 Finish를 누르도록 한다. 

 

 

 

 

 

강의를 따라가는 도중 종종 내가 따라친 코드가 잘못되어 강사님에게 코드를 다시 받아와야할 일이 생기는 경우가 생길 수 있다. 그런경우를 대비하여 강사님께 실행되는 코드를 다시 받아 오는 방법 

 

먼저 확인 * 이미 있는 파일을 새로 받아오는 경우 중복된 파일로 인해 오류가 발생할 수 있다. 반드시 기존의 파일을 지운후 새로 받아오는 방향이어야 한다. 

push: 강사님이 기존의 코드나 새로 입력한 코드를 GitLab에 업로드 하는 모든 행위

pull : GitLab에 올려진 코드를 나의 이클립스 workspace나 나의 컴퓨터 환경으로 가져오는 것

 

 

PULL

- 새로운 이클립스창을 열어 실행한뒤  Import projects 를 클릭한다.

 

- Git 클릭 후 깃으로부터 가져오는 것이므로 Projects from Git 클릭.

 

- 두가지의 선택지가 뜨는데 가져와야하는건 내 컴퓨터에 존재하는게 아니라 GitLab 내의 URL이므로 Clone URL 클릭 

 

- GitLab 창을 열어 Clone 을 누른 후 "Clone with HTTPS" 하단 Copy URL 클릭한다.

 

 

- 다시 이클립스로 돌아와 URL 항목에 복사한 URL을 붙여 넣은 뒤 하단에 나의 GitLab 이메일과 비밀번호를 차례로 입력한다.

(주의* 구글 연동의 경우 연동이 잘 안되는 경우도 있으니 깃랩 내에서 다시한번 비밀번호를 설정하는 작업이 필요)

 

 

 

 

- 위치를 설정하는 등의 작업을 이어가며 하여 NEXT 

 

 

 

 

 

PULL(2) 중간에 수정이 되는 내용을 PULL 해오는 방법

 

- 우선 강사님께 업데이트 된 내용을 push 요청한다.

 

- 좌측 파일명에 대고 오른쪽 버튼을 클릭하여 TEAM을 누른다.

- 두가지의 동일한 PULL이 있는데 가장 위에있는 PULL을 클릭

 

 

 

- 나의 이메일과 비밀번호를 치고 확인한다.

 

 

- 만약 새로 업데이트 된 내용이 없다면 다음과같은 창이 뜬다.

 

 

 

(+) 만일 Conflict 가 났을 경우 해결법 : 기존에 받아온 파일을 건들였기에 새로받아오는 파일과 충돌이 생긴것
애초에 기존 파일을 건들지 않도록 유의하거나 그냥 프로젝트를 삭제하고 새로 받아오는 방법이 빠르다. 

 

 

 

 

 

 

 

목차

1. 프로그래밍의 속 여러 정의

2. 자바 언어의 특징 

3. JVM이란? 

4. 자바의 설치

5. 이클립스의 설치

6. 자바 프로그래밍의 순서 

 

 

 

1. 프로그래밍의 속 여러 정의

 

(1) 프로그래밍 

- 프로그래밍이란? 프로그램을 작성하는 것. 우선 프로그램이란, 컴퓨터가 인식할 수 있는 명령어들을 순차적으로 나열 해두었다는 개념이다. 이런 프로그램을 작성하는 과정을 의미한다. 다른말로 '코딩(coding)' 이라고 한다.

 

* programmer 와 coder의 차이는? 뉘앙스의 차이가 있다.

programmer : 좀더 구조적인 부분을 생각을 해서 작성을 하는 사람

coder : 주어진 상황안에서 코드를 작성하기만 하는 사람

 

개발자가 궁극적으로 지향하는 바는 프로그래머(programmer)가 되어야 한다. 

 

(2) 프로그래밍 언어

- 프로그래밍 언어란? 프로그램을 작성하기위한 언어체계이다. 사람이 컴퓨터와 소통하게 하는 요소이며 프로그래밍 언어는 한가지에 국한되지않는다. 

- 2019년 기준 tiobe 사이트 기준 C 언어와 자바가 나란히 1,2위를 차지하고있다. 자바와 파이썬의 간격도 조금씩 좁혀지고 있다.

- 각 언어의 등장 배경이 다르다. 하나의 언어를 보완하기 위해 다른 언어가 나타나기도 한다. 

- 그렇다면 다른 언어가 1위인데 왜 자바를 배워야 할까? 

1. 이미 자바로 만들어져있는 프로그램이 너무 많기 때문에 여전히 자바에대한 필요성을 인식할 필요가 있다.

2. 자바가 초심자가 접근하기에 편하고 이해하기 쉽다. 자바를 기반으로 하여 다른 프로그래밍 언어로의 접근이 용이.

3. 자바를 통해 객체지향 프로그래밍에 대한 이해에 용이 

 

 

 

 

 

2. 자바 언어의 특징 

 

(1) 자바는 운영체제에 독립적이어서 이식성이 우수하다. 

EX: 영어를 모르는 한국인이 영어를 사용하려면 파파고라는 번역기를 사용하는 것처럼

인간의 언어를 모르는 컴퓨터에게 명령을 전달하려면 Compile 이라는 과정이 필요하다. 

 

C 언어라면 윈도우나 리눅스에서는 별도의 번역기 같은 존재가 필요하지만

JAVA 라면 그러한 존재는 필요없이 각 운영체제 위에 존재하는 JVM이 있다. 

어떤 운영체제이든  JVM(Java Virtual Machine)이 각각의 운영체제에 맞게 동작하게 해주는 역할을 한다. 

즉 운영체제에 맞춰 별도의 번역기가 필요하지 않다. JVM에 있어선 운영체제를 신경쓸 필요가 없다.

이것이 자바 언자가 운영체제에 독립적이라는 의미이다.  

 

(2) C언어에선 메모리를 할당하고 메모리를 회수하는 과정이 필요하지만 JAVA에서는 프로그래머의 영역이 아니다.

프로그래머가 신경써야할 부분이 줄어 편의를 제공한다.

 

(3) 풍부한 오픈소스가 제공되며 멀티쓰레드 환경을 제공한다.  

 

 

 

3. JVM(Java Virtual Machine) 이란?

 

- 자바를 실행하기 위한 가상 기계

- 플랫폼에 의존적

- byte code(class파일)를 해석하고 실행하는 interpreter

- 운영체제에 맞게끔 동작하게 때문에 어떤 운영체제에서든 작동할 수 있다. 

- JVM이 이해할 수 있는 파일 : Java Byte Code

 

윈도우나 리눅스 어떤 운영체제든 JVM이 맞춰서 동작한다. 

자바코드로 언어 입력 ---- 컴파일 ---- JAVA BITE CODE (JVM)  --------------리눅스, 윈도우 등의 운영체제

(우리가 이해)                (번역기)     ( 컴퓨터가 이해할 수 있음)

 

 

 

 

4. 자바의 설치 

 

(1) 자바 개발 환경

사용자/개발자 입장에 따라 설치하는 범위가 달라짐

JVM이 동작하기위해선 추가적인 기능들이 필요하다. 추가적인 라이브러리 기능, 이런걸 포함하는 환경은 JRE 이다.

실행에 국한되지않고 개발로 나아갈 수 있어야한다. JDK 의 필요성.

 

(2)  자바의 범위 (아래로 갈수록 큰 규모)

JAVA SE : Java Standard Edition, 기본적으로 데스크탑에서 동작

JAVA EE : Java Enterprise Edition, 웹 개발을 위한 기능들이 포함

JAVA ME : Java Micro Edition, micro 의 의미로 보아 작은 기계등에 부착 가능, 작은 기기들에 맞게 프로그래밍 되어있는것 

 

우리는 웹개발을 해야하므로 궁극적으론 EE를 사용할 수 있게 된다.  

 

JDK는 어떤 범위일까? 이것이 포함하는 것은 결국  Compiler의 영역. 개발한 코드를 동작하게 하려면 컴파일의 역할이 필요하다. 

 

- JDK

오라클 소유의 자바 프로그래밍 언어와 플랫폼 자체는 오픈으로 누구나 무료로 사용할 수 있다.

하지만 자바란 개발언어를 쉽게 활용하기 위해서는 개발환경인 JDK(Java Development Kit) 필요

 

- JDK는 Oracle JDK와 Open JDK가 존재

Oralce JDK는 비상업적인 용도에 한해서는 무료이지만 상업적 용도는 유료 구독형 라이선스로 구매 (Oracle JDK 8은 2019년 1월 이후 업데이트부터 라이선스 구독을 요구함)

 

Open JDK는 오라클이 오픈소스 커뮤니티에 제공한 소스기반으로 오픈소스로 개발되고 있으며 무료

(개인적인 용도로 사용하는 것은 문제가 되지 않지만 버그 패치나 보안 문제에 대한 서비스 지원은 되지 않음)

 

실제 기업에서도 Open JDK나 Azul Systems의 Zulu같은 대안 JDK를 고민 함 JDK자체는 특정 라이브러리를 제외하면 큰 차이가 없으므로 수업은 Open JDK를 설치

 

오픈 소스는 사용에 있어 문제가 없으나 오라클 JDK는 서비스에 있어서는 유료 필요 

 

 

 

 

(4) 자바다운로드

- 무조건 최신 버전으로 받지는 않음, 왜냐면 안정성에 관한 문제가 있기 때문

윈도우 환경인 경우 msi

https://github.com/ojdkbuild/ojdkbuild)

 

(5) 자바 개발 환경

- Compile Test 컴파일은 번역기와같은 역할이라고 했음

1. workspace 만들기 => C:\workspace 폴더 생성

2. HelloWorld.java 파일 생성 => C:\workspace\HelloWorld.java 파일 생성

3. cmd창 열기 => 시작 > 실행 > cmd 입력(윈도우 키 + R)

4. workdspace 경로 찾아가기 => C:\ > cd workspace

5. Compile 하기 => C:\workspace > javac HelloWorld.java

6. 실행하기 => C:\workspace > java HelloWorld

 

(6)

cmd 명령어

- cd : change directory

- .. : cd.. 로 입력하면 한 폴더 위로 이동

- dir : directory의 약어 

- javac : 프로그래밍 언어로 작성된 파일을 class파일로 compile 해줌

- java : class 화 된 파일을 JVM이 이해할 수 있도록 작성됨. 실행하라는 명령

 

 

 

5. 이클립스의 설치 

통합개발 환경의 일종

 

(1) Eclipse 환경

- Encoding 설정
Window > preferences 선택
General > Workspace 선택
Encoding type을 UTF-8 로 설정

 

(2) 이클립스 설치 후 유용한 단축키

- ctrl + Shift + 플러스 부호 : 화면 폰트 크기 확대

- ctrl + s : 파일 저장

- ctrl + shift + +/- : 폰트사이즈 변경 

 

(3) 기억할 것 

- 파일명을 입력할때 프로젝트명은 주로 소문자로 작성, 띄어쓰기는 - 를 이용

- 되도록 한글 경로명은 작성하지 말 것

 

(4) Class 의 작성순서 

   [1] 패키지(pachage) 선언

   [2] 임포트(import) 선언

   [3] 클래스(class) 작성부

 

(4)-1 Class란? 

자바에서 모든 코드는 반드시 클래스 안에 존재
서로 관련된 코드들을 그룹으로 나누어 별도의 클래스 구성
클래스들이 모여 하나의 Java 애플리케이션 구성

  

(5) main

‘public static void main(String[] args)’는 main 메소드의 고정 된 선언부
프로그램 실행 시 java.exe에 의해 호출 됨
모든 클래스가 main메소드를 가지고 있어야 하는 것은 아니지만 하나의 Java애플리케이션에는
하나의 main메소드를 포함한 클래스가 반드시 하나는 있어야 함

 

 

 

 

 

 

 

'Programming > JAVA' 카테고리의 다른 글

메소드  (0) 2021.12.22
연산자  (0) 2021.12.21
변수와 리터럴  (0) 2021.12.20
변수 파트 암기할 표 정리  (0) 2021.12.18
변수  (0) 2021.12.17

+ Recent posts