[오늘 공부한 부분]

 

1. Java 열거 타입

 


1. 열거 타입

  • 열거 타입(enumeration type) : 한정된 값만을 갖는 타입
  • 열거 상수(enumeration constant) : 열거 타입은 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입이다.

  • 여기서 Week가 열거 타입이고, MONDAY ~ SUNDAY는 열거 상수이다.
  • Week로 다음과 같이 변수를 선언할 수 있다 : Week today;  
  • today 변수에 저장할 수 있는 건 Week에 선언된 7개의 열거 상수 중 하나이다 : today = Week.FRIDAY;

 

참고로 인텔리제이에서는 클래스를 만들 때 enum파일을 설정할 수 있다.

 

 

2. 열거 타입 선언

  • 먼저 열거 타입의 이름을 정하고 해당 이름으로 소스파일(.java)를 생성한다.
  • 열거 타입의 이름은 관례적으로 첫 글자를 대문자로 하고 나머지는 소문자로 구성한다. : Week.java
  • 만약 여러 단어로 구성된 이름이라면 각 단어의 첫 글자는 대문자로 하는 것이 관례 이다. : ProductKind.java
  • 열거 상수관례적으로 모두 대문자로 작성한다. : MONDAY ... SUNDAY
  • 만약 열거 상수가 여러 단어로 구성될 경우 단어 사이를 (_)로 연결한다. : LOGIN_SUCCESS
public enum 열거타입이름 {열거 상수1, 열거 상수2, ...}

 

 

3. 열거 타입 변수

  • 아래와 같이 열거 타입 변수를 선언할 수 있다.
  • 열거 타입 변수를 선언했다면, 열거 상수를 '열거타입.열거상수' 형태로 저장할 수 있다.
  • 열거 타입 변수도 null 값을 저장할 수 있다.
Week today; // 열거 타입 변수 ㅅ선언

Week today = Week.SUNDAY; //다음과 같이 열거 상수 저장

Week birthday = null; //열거 타입 역시 참조 타입이기 때문에 null값을 저장할 수 있다.

 

  • 열거 타입 변수 today는 스택 영역에 저장된다.
  • today에 저장되는 값은 Week.SUNDAY 열거 상수가 참조하는 객체의 번지이다.
  • 따라서 열거 상수 Week.SUNDAY와 변수 today는 서로 같은 Week 객체를 참조하게 된다.
  • 따라서 today == Week.SUNDAY (true)

 

※ 열거 타입 Week를 이용하려면 날짜 정보가 필요하다.

이때 Calendar 클래스를 사용한다

Calendar now = Calendar.getInstance();

Calendar 객체를 얻었다면 get()메소드를 이용해서 다음과 같이 얻을 수 있다.

int year = now.get(Calendar.YEAR); //연
int month = now.get(Calendar.MONTH)+1; // 월
int day = now.get(Calendar.DAY_OF_MONTH); //일
int week = now.get(Calendar.DAY_OF_WEEK); //요일
int hour = now.get(Calendar.HOUR);//시
int minute = now.get(Calendar.MINUTE); //분
int second = now.get(Calendar.SECOND); //초

Calendar를 사용하기 위해서는 import문이 필요하다 : import java.util.Calendar; 

 

 

※ 열거 타입과 열거 상수 예시

  • Calendar를 사용하기 위해 인텔리제이가 자동으로 import해주었다.
  • 열거 타입 변수를 선언하고, Calendar 클래스를 통해 오늘 요일 값을 받는다.

  • 열거 변수 today에 열거 상수를 대입해 준다.

  • 실행해 보면, 이 글을 작성하는 오늘은 토요일이기 때문에, 다음과 같은 값을 얻을 수 있다.

 

'Coding > Java' 카테고리의 다른 글

[10] JAVA - 필드(Field)  (0) 2022.11.22
[09] Java 클래스 - 객체 지향 프로그래밍  (2) 2022.11.22
[07] Java 배열  (0) 2022.11.11
[06] Java 참조 타입  (0) 2022.11.11
[05] Java 조건문과 반복문  (0) 2022.11.11

[오늘 공부한 부분]

1. Java 참조 타입과 참조 변수 

2. Java 배열


1. 배열이란?

  • 같은 데이터의 타입을 연속된 공간에 나열하고 각 데이터에 인덱스를 부여해놓은 자료구조
  • 인덱스(Index)는 배열 항목에 붙인 번호로 0부터 시작하여 (배열길이 -1)까지 범위를 갖는다.
  • 배열은 같은 타입의 데이터만 저장할 수 있다. (int 배열은 int 값만 저장 가능하고, String 배열은 String 값만 저장)
  • 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다. 
  • 만약 배열의 길이를 수정하고 싶다면 새로운 배열을 생성하고 기존 배열 항목을 새 배열로 복사해야 한다.

 

2. 배열 선언

① 형식 1 : 타입[] 변수;

                 ex) int[ ] intArray;

② 형식 2 : 타입 변수[];

                 ex) int intArray[ ];

 

  • 변수 선언과 비슷한데 대괄호 [ ] 가 추가된 타입이다. 
  • 위에서 intArray가 배열 변수이다.
  • 배열도 객체이므로 힙 영역에 생성되고 변수는 힙 영역의 배역 객체를 참조한다.
  • 만약 참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화 된다.

 

3. 배열 생성

① 값 목록으로 배열 생성 :타입[] 변수 = {값0, 값1, 값2, 값3, ....};

  • 주의할 점 : 배열 객체를 생성할 때 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않는다.
  • 배열 변수를 미리 선언한 후 값 목록들이 결정되는 상황이라면, new연산자를 사용한다. 변수 = new 타입[ ] {값1, 값2, 값3...};

 

ex1)

String [ ] names = {"제니", "리사", "로제"};

names[0] = "제니";

 

ex2)

String[ ] names = null;

names = new String[ ]{"제니", "리사", "로제"};

 

② new 연산자로 배열 생성 : 타입[] 변수 = new 타입[길이];

  • 값의 목록을 가지고 있지 않지만 향후 값들을 저장할 배열을 미리 만들고 싶을때 사용한다.

ex)

int [ ] scores = new int[3];

scores[0] = 80;

scores[1] = 90;

scores[2] = 100;

 

 

4. 배열 길이

  • 배열에 저장할 수 있는 전체 항목의 개수
  • 배열변수.length(); 를 통해 길이를 알 수 있다.
  • 배열의 length 필드는 for문을 사용해서 배열 전체를 루핑할 때 유용하다.

 

5. 명령 라인 입력

 

https://kephilab.tistory.com/40

  • main()메소드의 매개값인 String[ ] args 가 왜 필요할까?
  • 명령 라인(명령 프롬프트)에서 위 코드를 java명령어로 실행하면 JVM은 길이가 0인 Strign배열을 먼저 생성하고 main()메소드를 호출할 때 매개값으로 전달한다.
  • main()메소드는 String[ ] args 매개 변수를 통해서 명령 라인에서 입력된 데이터의 수(배열의 길이)와 입력된 데이터(배열의 항목 값)를 알 수 있게 된다.

예제 1

 

  • 위 예제 1을 그냥 실행하면 '값의 수가 부족합니다' 라는 결과 값을 얻는다.
  • 실행할 때 매개값을 주지 않았기 때문에 길이 0인 String 배열이 매개값으로 전달되어 if문의 조건이 true가 되었기 때문이다.

 

 

같은 예제를 인텔리제이 [Run] - [Run Confiurations] 를 통해 arguments 값 (즉, 매개값) 을 10 20 으로 준다면 '10+20=30' 이라는 결과값을 도출할 수 있다.

 

명령 프롬프트에서 실행한다면 아래와 같은 형식으로 입력하면 된다.

[JDK 11이후 버전] java -p . -m 프로젝트파일명/pakage명.소스코드명 매개값1 매개값2

 

 

6. 다차원 배열

  • 행과 열로 구성된 2차원 배열

 

http://www.tcpschool.com/c/c_array_twoDimensional

 

int[ ][ ] scores = new int [2][3];

scores.length // 2

scores[0].length // 2

scores[1].length // 3

 

예시)

int[ ][ ] scores = { {95, 80}, {92, 96} };

int score = scores[0][0]; //95

int score = scores[1][1]; //96

 

 

7. 객체를 참조하는 배열

  • String[ ] 배열는 각 항목에 문자열이 아니라, String 객체의 번지를 가지고 있다.
  • 즉, String[ ] 배열은 String 객체를 참조하게 된다.
  • String[ ] 배열 항목 간에 문자열을 비교하기 위해서는 == 연산자 대신 equals()메소드를 사용해야 한다.
  • ==연산자는 객체의 번지를 비교하기 때문에 문자열을 비교하는데 사용할 수 없다.
  • 이 내요은 [05] Java 참조 타입 글 참고하기 ! https://leejincha.tistory.com/80

 

8. 배열 복사

배열은 한 번 생성하면 크기를 바꿀 수 없기 때문에 새로운 배열을 생성해서 항목 값을 복사해 주어야 한다.

 

① for문으로 배열 복사

 

② System.arraycopy()로 배열 복사

 

https://jwprogramming.tistory.com/120

 

 

 


연습문제 1 > for 문을 이용해서 주어진 배열의 항목에서 최댓값을 구하세요.

연습문제 2 > 중첩 for 문을 이용해서 주어진 배열의 전체 항목의 합과 평균값을 구하세요.

※ 위의 문제에서 count 변수를 선언한 이유는 평균을 구하기 위함이다. count++를 통해 for문이 돌 때마다 횟수를 얻음으로써 전체 객체 수를 구할 수 있다.

'Coding > Java' 카테고리의 다른 글

[09] Java 클래스 - 객체 지향 프로그래밍  (2) 2022.11.22
[08] Java 열거 타입  (0) 2022.11.12
[06] Java 참조 타입  (0) 2022.11.11
[05] Java 조건문과 반복문  (0) 2022.11.11
[04] Java 연산자와 연산  (0) 2022.11.11

 

[오늘 공부한 부분]

1. Java 참조 타입과 참조 변수 

2. Java 배열

 


1. 참조 타입

  • 참조 타입(reference type) : 객체(object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스를 말한다.
  • 기본 타입(primitive type)인 byte, char, short, int, long, float, double, boolean 변수는 실제 값을 변수 안에 저장한다.
  • 하지만 참조 타입 변수는 메모리의 번지를 변수 안에 저장한다. = 번지를 통해 객체를 참조한다는 뜻 ! 
  • 정리하자면, 기본 타입의 변수와 객체는 스택 영역에 한번에 저장되고, 참조 타입은 변수는 스택영역에 그리고 객체는 힙 영역에 저장된다고 생각하면 된다.

 

https://www.naukri.com/learning/articles/data-types-in-java-primitive-and-non-primitive-data-types/

 

 

2. 메모리 사용 영역(Runtime Data Area)

 

https://www.quora.com/How-many-types-of-memory-areas-are-allocated-by-JVM

 

※ Some of the memory areas allocated by JVM are:


1. ClassLoader : It is a component of JVM used to load class files.
2. Class (Method) Area : It stores per-class structures such as the runtime constant pool, field and method data, and the code for methods.
3. Heap : Heap is created a runtime and it contains the runtime data area in which objects are allocated.
4. Stack : Stack stores local variables and partial results at runtime. It also helps in method invocation and return value. Each thread creates a private JVM stack at the time of thread creation.
5. Program Counter Register : This memory area contains the address of the Java virtual machine instruction that is currently being executed.
6. Native Method Stack : This area is reserved for all the native methods used in the application.

 

메소드 영역 (Method Area) : JVM이 시작할 때 생성, 모든 스레드가 공유하는 영역

힙 영역 (Heap Area) : 객체와 배열이 생성되는 영역. 객체를 참조하는 변수나 필드가 없다면 그 객체를 쓰레기로 취급하고 쓰레기 수집기(Gabage collector)를 실행시켜 자동으로 제거한다. 따라서 개발자는 따로 객체를 제거할 필요가 없다.

JVM 스택 영역 (JVM Stack) :

  • 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행.
  • 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.
  • 기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만, 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 가진다.(다시 한번)

 

3. 참조 변수의 ==, != 연산

  • 기본 타입 변수의 ==, != 연산은 변수의 값이 같은지 아닌지를 조사하지만
  • 참조 타입 변수의 ==, != 연산은 동일한 객체를 참조하는지 다른 객체를 참조하는지 알아볼 때 사용된다.
  • 참조 타입 변수 값 = 힙 영역 객체의 주소 (따라서 번지 값을 비교하는 것.)

 

4. null 과 NullPointerException

  • null(널) 값 : 참조 타입의 변수가 힙 영역의 객체를 참조하지 않는다는 뜻
  • null 값도 초기값으로 사용할 수 있기 때문에, null로 초기화된 변수는 스택 영역에 생성된다.
  • 예외(Exception) : 자바 프로그램 실행 도중 발생하는 오류
  • NullPointerException는 가장 많이 발생하는 예외 중 하나 - 참조 변수를 잘못 사용했을 때 발생! 

예를 들면, 참조 변수의 값이 null이라면 객체가 존재하지 않기 때문에 필드나 메소드를 사용하는 코드를 실행하면 발생한다.

int[] intArray = null;
intArray[0] =10; // NullPointerException 발생 !

String[] str = null;
System.out.println("총 문자수:" + str.length()); //NullPointerException 발생 !

 

 

5. String 타입

  • 자바는 문자열 리터럴(값)이 동일하다면 String 객체를 공유하도록 되어있다.
  • 만약 문자열이 같은 새로운 객체를 만들고 싶다면 객체 생성 연산자인 new 연산자를 사용한다.
  • 아래의 예시와 같이 문자열 리터럴로 생성하느냐 new 연산자로 생성하느냐에 따라 비교 연산자의 결과는 달라진다. 
  • 동일한 String 객체이건 다른 String 객체이건 상관 없이 내부 문자열을 비교하고 싶을 때에는 equals()메소드를 사용한다.
String name1 = "신용권";
String name2 = "신용권";

String name1 == String name2 (true)

String name3 = new String("신용권");
String name4 = new String("신용권");

String name1 == String name2 (false)
String name3 == String name4 (false)

name3.equals(name4) (true) // 문자열 값 자체는 같기 때문에 !

 

 

equals() vs hashCode() vs System.identityHashCode() 비교

 

  • equals() : equel은 두 객체의 참조값을 비교하는 Method
  • hashCode() : 객체의 해시코드(정수로 구성된 주소값)를 반환하는 Method, 객체의 주소를 int로 변환해서 반환한다. 그러나 문자열이 같은 경우 같은 정수값을 도출한다.
  • System.identityHashCode() : 객체 번짓수 값을 확인해주는 Method. 객체 자체를 비교하려면 이 메소드를 사용하는 것이 좋다.

 

[정리 !]

  • String 타입의 변수가 서로 다른 객체를 가지더라도 문자열만 같으면 hashCode() 값이 같다.
  • String 타입 변수의 주솟값 즉, 번짓수는 System.identityHashCode()를 통해 분별할 수 있으므로, 이 함수를 적용해야 서로 다른 객체를 갖고있는지 판단 할 수 있다.

 

Object's hashCode() method does not have a unique value for each object because it can be overridden in subclasses. This method can be overridden to express that the properties of the objects are the same. For example, if the hashcode of a String is, it means that the string is the same even if the objects are different.

On the other hand, System.identityHashCode() cannot be overridden and returns a unique hashCode of the object. It is recommended to use this method if you want to compare the objects themselves.

 

[ 출처 ]

https://codechacha.com/ko/java-hashcode/

https://codechacha.com/en/java-system-identityhashcode/

 

'Coding > Java' 카테고리의 다른 글

[08] Java 열거 타입  (0) 2022.11.12
[07] Java 배열  (0) 2022.11.11
[05] Java 조건문과 반복문  (0) 2022.11.11
[04] Java 연산자와 연산  (0) 2022.11.11
[03] Java 시작하기(설치), 변수와 타입  (1) 2022.11.11

[오늘 공부한 부분]

1. Java 조건문 - if문, switch문 

2. Java 반복문 - for문, while문, do-while문


1. 제어문

  • 자바 프로그램은 메소드의 시작 중괄호에서 끝 중괄호 까지 위에서 아래로 실행하는 흐름을 갖고 있다.
  • 이러한 실행 흐름을 개발자가 원하는 방향으로 바꿔주는 것을 (흐름)제어문 이라고 한다.
제어문 조건문   if 문   if(조건식){...} 형태로 조건식이 true이면 중괄호 내부를 실행
  swich 문 switch(변수){case 값1:... case 값2:..dfault:...}형태로 변수의 값에 따라 코드를 실행
반복문   for 문  for(초기화식;조건식;증감식){...}형태로 조건식이 true가 될 때까지만 중괄호 내부 반복되고 반복할 때마다 증감식이 실행된다. 초기화식은 사용할 변수를 초기화 해준다. 주로 지정된 횟수만큼 반복할 때 사용
  while 문  while(조건식){...}형태로 조건식이 true가 될 때까지만 중괄호 내부 반복
  do-while 문  do{...}while(조건식) 형태로 중괄호 내부를 먼저 실행하고 그다음 조건식이 true가 되면 다시 중괄호 내부를 반복 실행

 

[ + 추가 ] 

  • break 문 : for문, while문, do-while문 내부에서 실행되면 반복을 취소
  • contiune 문 : for문, while문, do-while문 내부에서 실행되면 증감식 또는 조건식으로 돌아감 

 

 

2. 조건문

① if문

  • if문의 기본 원리는 조건식이 true 이면 블록을 실행하고 false이면 실행하지 않는 것 !
  • if문에서 괄호{}블록은 생략하지 않고 작성하는 것이 가독성이 좋고 버그 발생을 줄일 수 있다.

 

출처 : https://www.geeksforgeeks.org/java-if-else-if-ladder-with-examples/
if문 예제 1부터 100까지 3의 배수 총합을 구하시오.

 

② switch문

  • 변수가 어떤 값을 갖느냐에 따라 실행문이 선택되는 조건 제어문이다.
  • 때문에 같은 코드를 작성하더라도 if문보다 코드가 간결하다.
  • switch문은 괄호 안의 변수 값과 동일한 값을 같는 case로 가서 실행문을 실행
  • 만약 괄호 안의 변수 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행한다. default는 생략 가능하다.

 

출처 : https://www.geeksforgeeks.org/

 

 

※ 다음은 while 문, switch문, Scanner, nextLikne()을 사용한 예시이다.

1. 먼저 불리언 변수를 true로 설정해 주고, Scanner 와 Integer.parseInt(scanner.nextLine())을 통해 입력된 정수값을 받는다.

2. 그리고 Switch문을 통해 변수값에 따른 실행문을 실행한다.

3. 여기서 case 끝에 붙어 있는 break; 는 다음 case를 실행하지 않고 switch문을 빠져나가기 위함이다.

 

 

3. 반복문

  • for문과 while문은 서로 변환이 가능하다.
  • for문은 반복 횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다.
  • 제어문 블록 실행이 완료되었을 경우 조건문의 경우 정상 흐름으로 돌아오지만,
  • 반복문의 경우 제어문 처음으로 다시 되돌아가 반복 실행한다. 이를 루핑(looping)이라고 한다.

① for 문

 

출처 : https://www.geeksforgeeks.org/

 

  • 주어진 횟수 만큼 실행문을 반복 실행할 때 사용한다.
  • 어떤 경우에는 초기화식이 둘 이상 있을 수 있고, 증감식 역시 둘 이상 있을 수 있다. - 쉼표로 구분!
  • 초기화식에서 선언된 변수는 for문 블록 내부에서 사용되는 로컬변수 이기 때문에 for문 밖에서는 사용할 수 없다.
  • 초기화식에서 루프 카운터 변수로 float타입을 사용할 수 없다.

※ 중첩 for 문

중첩 for문 예시1
중첩 for문 예시2

※ 중첩 for 문 : for문은 다른 for문을 내포할 수 있는데, 이 경우 바깥쪽 for문이 한 번 실행할 때마다 중첩된 for문은 지정된 횟수만큼 돌다가 다시 바깥쪽 for문으로 돌아간다.

 

 

② while 문

 

출처 : https://www.geeksforgeeks.org/

 

  • 조건식이 true일 경우 계속해서 반복하는 반복문
  • 조건식에는 boolean타입 변수나 true/false값을 산출하는 어떤 연삭식이든 올 수 있다.
  • 만약 while(true){...} 로 된다면 무한 루프를 돌게 되는데, 이때는 while문을 종료시키기 위해 변수값을 false로 만들거나, break문을 이용하는 방법이 있다.

while문과 if문을 이용한 예제 1
while문과 if문을 이용한 예제 2

 

③ do - while 문

 

출처 : https://www.geeksforgeeks.org/

 

  • 블록 내부의 실행문을 우선 실행하고 실행 결과에 따라서 반복 실행을 게속할지 결정 하는 반복문
  • 작성시 반드시 while()뒤에 ; 세미콜론을 붙여야 한다!

 

④ breack 문

  • 반복문인 for문, while문, do-while문, switch문을 실행 중지할 때 사용
  • 대게 if문과 같이 사용되어 if문의 조건식에 따라 for문과 while문을 종료할 때 사용
  • 만약 반복문이 중첩되어 있을 경우 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료하지 않음 
  • 따라서 바깥쪽 반복문도 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙여야함.

Outter 이라는 라벨을 붙여준 덕분에 안쪽에서도 break 할 수 있다

 

 

⑤ continue 문

  • 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동
  • 반복문을 종료하지 않고 계속 반복을 수행한다는 점이 break와 다르다.
  • if문과 함께 쓰여 특정 조건을 만족하는 경우에 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어간다.

for문, if문, continue문 을 사용해서 10이하의 짝수 프린트하기

 

'Coding > Java' 카테고리의 다른 글

[07] Java 배열  (0) 2022.11.11
[06] Java 참조 타입  (0) 2022.11.11
[04] Java 연산자와 연산  (0) 2022.11.11
[03] Java 시작하기(설치), 변수와 타입  (1) 2022.11.11
[02] 생활코딩 Java 입문 강의 정리 (2)  (0) 2022.11.04

[오늘 공부할 부분]

 

- 어제 헷갈렸던 연습문제 복습

1. 연산자와 연산식

2. 연산자의 종류


- 어제 문제 복습

 

첫번쨰 -> 첫번째, 덧셉결과 -> 덧셈결과 오타가 있네요 !

※ 헷갈렸던 부분 :

scanner.nextLine()은 문자열을 읽어오고 그걸 다시 Integer.parseInt()로 받으면 int화 될 것 같은데 왜 첫번째 수에 A를 넣고 두번째 수에 B를 넣으면 오류가 나는 것일까? 내가 가정했던 부분은 A가 65 이고 B가 66이기 때문에 그 합이 결과값으로 나올 거라 예상했다. 

 

팀원들과 토론 후 내린 결론 (확실하지 않음...) → 

① String 타입은 char 타입으로 강제 캐스팅할 수 없다. - char 타입 이었다면 int 타입으로 변환되서 가능했을지도.

② int 타입엔 문자인 'A'나 'B' 자체가 들어갈 수 없다.

③ 참고 ( char 타입 산술 연산 할 때 int 타입 결과 값이 아니라 char 타입으로 받는 방법 )

 

 

 

1. 연산자와 연산식

① 기초 개념

  • 연산자(operator) : 연산에 사용되는 표시나 기호 ex) +, -, *, /, %
  • 피연산자(operand) : 연산되는 데이터 ex) 3 + x 연산식의 피연산자는 3과 x
  • 연산식(expression) : 연산자와 피연산자를 이용하여 연산의 과정을 기술한 것
  • 연산 우선순위 : 괄호()로 감싼 연산이 최우선순위를 갖는다.
  • 연산식은 반드시 하나의 값을 산출한다.
  • 산술 연산자의 경우 숫자타입(byte, short, int, long, float, double)으로 결과 값이 나오고, 비교연산자와 논리 연산자는 논리타입(boolean)으로 결과 값이 나온다.

② 연산자의 종류

출처 : https://docs.oracle.com/javase/tutorial/
출처 : https://medium.com/@katekim720/ , 신용권 <혼자 공부하는 자바>

③ 연산의 방향과 우선순위

  • 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
  • 산술, 비교, 논리, 대입 연산자 순으로 우선순우를 갖는다.
  • 단항, 부호, 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽이다.
  • 복잡한 연산식에는 괄호()를 사용해서 우선순위를 정한다.

 

2. 연산자의 종류

 

 단항 연산자 : 부호 연산자 (+,_), 증감 연산자(++,--), 논리 부정 연산자(!)

  •  부호 연산자: 양수 및 음수를 표시하는 +, -를 말한다. boolean, char 타입을 제외한 나머지 기본 타입에  사용할 수 있다.

※ 주의할 점은 부호 연산자의 결과가 int 타입이라는 것 ! 따라서 byte 타입 변수를 부호 연산하면 int 타입으로 변환된다.

 

  • 증감 연산자(*헷갈리는 파트): 변수의 값을 1증가 시키거나 1 감소 시키는 연산자. ( ※ 참고로 ++i  i = i + 1 의 연산 속도는 같다.)

출처 :&nbsp;https://unknownyun.blogspot.com/2018/08/blog-post_38.html

  • 논리 부정 연산자 (!) : 피연산자가 true이면 false 값을 산출, 피연산자가 false이면 true 값을 산출

 

 

 

② 이항 연산자 : 산술 연산자 (+, -, *, /, %), 문자열 결합 연산자(+), 비교 연산자(<,<=,>,>=,==,!=), 논리 연산자(&&,||,^,!), 대입 연산자(=,+=,-=,*=,/=,%=)

 

  • 산술 연산자와 문자열 결합 연산자는 어제 내용과 겹치기 때문에 오늘은 넘어가도록 한다.

 

  • 비교 연산자에서 주의할 부분은 float 타입이다. 실수의 저장 방식인 부동 소수점 방식때문에 아래와 같이 0.1 과 0.1f의 값이 다르다. 0.1f는 0.1의 근삿값(0.10000000149011612)으로 표현된다. 따라서 0.1보다 큰 값이 되어버린다. 
  •  이것의 해결책은 다음과 같이 피연사자를 모두 float 타입으로 변환하거나 정수타입으로 변환해서 비교하는 방법이 있다.
  • String 변수 비교: 기본 타입 변수 값을 비교할 때는 == 연산자를 사용하지만, 참조 타입인 String 변수를 비교할 때에는 equals() 메소드를 사용한다.

 

 

  • 논리 연산자

출처 : https://medium.com/@katekim720/ , 신용권 <혼자 공부하는 자바>

  • &보다 &&가 더 효율적 : &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false 라는 산출결과를 내지만 &는 두 피연산자를 모두 평가해서 산출 결과를 내기 때문 ! (| 와 ||도 마찬가지)
  • 논리 연산은 흐름 제어문인 조건문(if), 반복문 (for, while) 등에서 주로 이용

 

  • 대립 연산자는 오른쪽 피연산자 갑을 왼쪽 피연산자인 변수에 저장한다.
  • 대립 연산자는 모든 연산자들 중에서 가장  낮은 연산 순위를 가지고 있기 때문에 제일 마지막에 수행 된다.

 

 

③ 삼항 연산자

 

  • (조건식) ? A : B 를 말하며 조건이 true면 A를 산출하고, false이면 B를 산출 한다.
  • if 문을 쓰면 길어질 코드를 한 줄에 간단하게 작성 가능하기 때문에 효율적이다.

 

+ Recent posts