증감연산자는 피연산자의 값을 1씩 증가 또는 감소시키는 연산자이다. 증감 연산자가 변수 앞에 위치하느냐 변수 뒤에 위치하느냐에 따라 결과 값이 달라진다.
구분
연산자
설명
증감 연산자
x++
먼저 해당 연산을 수행한 후 피연산자의 값을 1증가 시킴
++x
먼저피연산자의 값을 1증가 시킨 후해당 연산을 수행함
x--
먼저 해당 연산을 수행한 후 피연산자의 값을 1감소 시킴
--x
먼저피연산자의 값을 1감소 시킨 후해당 연산을 수행함
// 증감연산자 ++, --
int x = 10;
//int y = x++; // y = x; x = x + 1;
int y = ++x; // x = x + 1; y = x;
System.out.println("x = " + x);
System.out.println("y = " + y);
산술 연산자
가장 기본이 되는 연산자로 4칙 연산(+, -, *, /)과 나머지 값을 구하는 나머지 연산자(%)가 있다.
구분
연산자
설명
산술 연산자
+
두 수에 대한 덧셈
-
두 수에 대한 뺄셈
*
두 수에 대한 곱셈
/
두 수에 대한 나눗셈
%
두 수를 나눈 후 그 나머지를 반환한다.
4칙 연산은 다 아는 내용이라 생략하고, 나머지 연산자만 알아봅니다.
나머지 연산자(%)는 프로그래밍 작업 시 자주 사용되는 연산자입니다. 나머지 연산자의 결과 값은 왼쪽 피연산자의 값을 오른쪽 피연산자의 값으로 나눈 나머지 값을 반환합니다.
예를 들어 (x % n) 의 경우 x의 값이 어떤 수가 들어오든 나올 수 있는 값의 범위는 0 부터 n-1의 범위를 갖습니다.
아래와 같이 (x % 7) 연산의 값의 범위는 0 ~ 6의 값만 나오게 됩니다. 다시 말해 결과값이 회귀하게 되는 것이죠. 그래서 알고리즘을 구현한다던지 이럴 때 자주 사용되는 연산자입니다. 꼭 기억하세요.
int x = 1234;
System.out.println("x % 7 = " + (x % 7)); // 0 ~ 6 사이의 값을 반환
System.out.println("x % 2 = " + (x % 2)); // 0 ~ 1 사이의 값을 반환, x값이 홀수인지 짝수인지 구분에 유용
시프트(shift) 연산자
시프트 연산자는 bit단위의 연산처리를 하며 자료의 가공을 위해 오른쪽 또는 왼쪽으로 이동하여 값에 대한 변화를 일으키는 연산자입니다.
변수나 상수의 값을 비교할 때 쓰이는 연산자로서 결과가 항상 true 또는 false인 논리값(boolean)이어야 한다.
구분
연산자
설명
비교 연산자
>
크다
<
작다
>=
크거나 같다
<=
작거나 같다
==
피연산자들의 값이 같다
!=
피연산자들의 값이 같지 않다
// 비교연산자 <, >, <=, >=, ==, !=
int x = 12;
int y = 15;
// boolean bool = x > y;
// boolean bool = x < y;
boolean bool = (x = x + 5) != y;
System.out.println("bool = " + bool);
논리 연산자
논리 연산자는 피연산자의 값이 true나 false인 논리 값을 가지고 다시 한번 조건 연산하는 연산자이다.
논리 연산자의 종류(1)
구분
연산자
의미
설명
논리 연산자
&
and (논리곱)
주어진 조건들이 모두 true일 때만 true를 나타낸다.
|
or (논리합)
주어진 조건들 중 하나라도 true이면 true를 나타낸다.
!
not (부정)
true는 false로 false는 true로 나타낸다.
논리 연산자의 종류(2)
구분
설명
&&
선조건이 true일 때만 후조건을 실행하며 선조건이 false이면 후조건을 실행하지 않는다.
||
선조건이 true이면 후조건을 실행하지 않으며 선조건이 false일 때만 후조건을 실행한다.
논리 연산자의 경우 논리곱(&, &&), 논리합(|, ||) 연산자가 2가지로 사용이 가능하다. 이들의 사용법은 차이가 있으며, 일반적으로 &&, || 이 연산자를 주로 사용한다.
// 논리연산자 &, |, !, &&, ||
x = 20;
y = 30;
bool = x < y || (x = x + 15) > y;
System.out.println("bool = " + bool);
System.out.println("x = " + x);
대입 연산자
특정한 상수 값이나 변수 값 또는 객체를 변수에 전달하여 기억시킬 때 사용하는 연산자이다.
구분
연산자
설명
대입 연산자
=
연산자를 중심으로 오른쪽 변수값을 왼쪽 변수에 대입한다.
+=
왼쪽 변수에 더하면서 대입한다.
-=
왼쪽 변수값에서 빼면서 대입한다.
*=
왼쪽 변수에 곱하면서 대입한다.
/=
왼쪽 변수에 나누면서 대입한다.
%=
왼쪽 변수에 나머지 값을 구하면서 대입한다.
// 대입연산자
int num = 120;
num += 30; // 풀어서 쓰면 num = num + 30; 과 같다.
System.out.println("num = " + num);
// num = num + 3.14F; // 에러 발생, 아래 코드와 같이 형 변환 해줘야 함.
num = (int)(num + 3.14F); // int형으로 형 변환 했으므로 정상처리
num += 3.14F; // 복합대입연산자를 사용시 대상 타입으로 자동 형 변환 해줌.
// 복합대입연산자의 형변환 : 복합대입연산자의 경우 최종 할당되는 변수의 데이터 타입으로 형 변환되서 계산됨.
// int x = 10; double y = 2.3;
// x += y; 이 코드는 x = (데이터타입)(x + y) 이렇게 계산이 됨.
int i = 10;
double rate = 0.01;
i += (i * rate); // 형변환되어서 들어가므로 에러 아님.
비트 연산자 피연산자 즉 연산의 대상이 되는 값들을 내부적으로 bit단위로 변경한 후 연산을 수행하는 연산자이다.
구분
연산자
설명
비트 연산자
&
비트 단위의 AND
|
비트 단위의 OR
^
XOR (배타적 OR)
~
단항 연산자 이며, 비트를 반전한다. 0은 1로 1은 0으로 만듬
// 비트 연산자 &, |, ^, ~
int num = 170;
System.out.println("num & 15 = " + (num & 15)); // num & 15 = 10 , mask 연산
System.out.println("num | 15 = " + (num | 15)); // num | 15 = 63, 특정 비트를 1로 셋팅
System.out.println("num ^ 15 = " + (num ^ 15)); // num ^ 15 = 58, 특정 비트를 반전시킬 때.
System.out.println("~num = " + (~num)); // ~num , 비트 반전, 1의 보수 표현
조건 연산자(삼항 연산자) 하나의 조건을 정의하여 만족 시에는 ‘참값’을 반환하고 만족하지 못할 시에는 ‘거짓값’을 반환하여 단순 비교에 의해 변화를 유도하는 연산자이다. 피연산자가 3개라 해서 삼항 연산자라고도 부른다.
구분
연산자
설명
구성
조건 연산자
? :
제어문의 단일 비교문과 유사하다.
조건식 ? 참값 : 거짓값
// 조건 연산자 cond ? true : false
char gender = 'F';
System.out.println(gender == 'M' ? "남성" : "여성");
// 어떤 수가 양수, 음수, 영인지 판별하시오.
int no = -12;
System.out.println(no == 0 ? "영" : ( no > 0 ? "양수" : "음수"));
조건문 📌
➡ if 문
조건식 결과 따라 중괄호 {} 블록을 실행할지 여부 결정할 때 사용한다.
➡ if-else 문
조건식 결과 따라 실행 블록 선택한다.
➡ if-else if-else 문
-복수의 조건식 두어 조건식을 만족하는 블록만 실행한다.
➡ 중첩 if 문
코드 실행 흐름을 이해하는 것이 가장 중요하다.
➡ Switch 문
변수나 연산식의 값에 따라 실행문 선택할 때 사용한다.
반복문 📌
➡ for 문
반복 횟수를 알고 있을때 주로 사용한다.
초기화 식 i = 0; 이 제일 먼저 실행된다 → 조건식 i <= 100; 을 평가해서 → 실행문 System.out.println(i); 실행 → 증감식 i++ 가 실행되어 → 결과 : 0~100까지의 값이 출력 된다.
➡ while 문
조건에 따라 반복을 계속할지 결정할 때 사용한다.
while 문은 for문으로 for문은 while문으로 바꾸어 출력 할 수 있다.
➡ do-while 문
조건 따라 반복을 계속할지 결정할 때 사용하는 것은 while문과 동일하다.
무조건 중괄호 { } 블록을 한 번 실행한 후, 조건 검사해 반복 결정한다.
➡ break 문
for 문, while 문, do-while 문 종료 (반복취소)
Switch 문 종료
대개 if 문과 같이 사용한다. (if 문 조건식에 따라 for 문과 while 문 종료할 때 사용한다.) break; 문이 가장 가까운 반복문을 만나 결과는 위와 같다.
➡ break 문 (반복문중첩)
반복문이 중첩되어 있을 경우 break; 문은 가장 가까운 반복문만 종료
바깥쪽 반복문까지 종료시키려면 반복문에 이름(라벨)을 붙이고, "break 이름;" 사용 해야 한다.
이름(라벨)을 붙여 원하는 위치에서 break 할 수 있도록 할 수 있다.
➡ continue 문
for 문, while 문, do-while 문에서 사용한다. (for 문: 증감식으로 이동 / while, do-while 문: 조건식으로 이동)
continue; 문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어가서 계속 진행하도록 한다.
1. 2차원 배열 선언 및 생성방법
2차원 배열을 아래와 같이 선언과 생성을 하게 되면,레퍼런스 변수와int 타입의 저장공간 6개가 아래 그림과 같이 생성됩니다.
(방법1) 배열의 선언과 생성을 나누어 사용
int[ ][ ] num; // 2차원 배열에 대한 레퍼런스 변수 선언
num =newint[2][3]; // 2차원 배열생성 (2차원 배열의 저장공간 할당)
(방법2) 배열의 선언과 생성을 한줄로 합쳐서 사용
int[ ][ ] num =newint[2][3];
cf) 2차원 배열의 선언방법은 아래 두가지 방법이 모두 가능함
2차원 배열 선언방법1 : int[ ][ ] num;
2차원 배열 선언방법2 : int num [ ][ ];
2차원 배열
2. 2차원 배열의 초기화 및 사용예제
2차원 배열을 생성과 함께 초기화 하기 위해서는 아래와 같이 사용합니다.
int[ ][ ] = { { 10, 11, 12 }, { 20, 21, 22 } };
(예제1)
public class HelloWorld {
public static void main(String[] args) {
int[][] num = { { 10, 11, 12 },
{ 20, 21, 22 } };
int total = 0;
System.out.println("num 배열 길이: " + num.length);
System.out.println("num[0] 배열 길이: " + num[0].length);
System.out.println("num[1] 배열 길이: " + num[1].length);
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num[i].length; j++) {
total = total + num[i][j];
System.out.println("num[" + i + "][" + j + "] : " + num[i][j]);
}
}
System.out.println("num 배열의 총합: " + total);
}
}
(출력결과)
생성자
생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.
생성자의 이름은 클래스의 이름과 같아야 한다.
생성자는 리턴 값이 없다. void 또한 사용하지 않는다.
생성자는 몇 가지 특징을 제외하면 메소드와 다르지 않다.
생성자는 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
기본 생성자(Default constructor)란?
우리가 생성자를 모르고도 자바 프로그래밍이 가능했던 이유는 아마 이 기본 생성자 덕분이 아니었나 싶다.
컴파일을 할 때, 소스파일의 클래스에 생성자가 하나도 정의되어있지 않으면 컴파일러가 자동으로 기본 생성자를 생성해서 컴파일해준다. 예를 들어보자.
class Data1 {
int value;
}
class Data2 {
int value;
Data2(int x) { // 매개변수가 있는 생성자.
value = x;
}
}
class ConstructorTest {
public static void main(String[] args) {
Data1 d1 = new Data1();
Data2 d2 = new Data2(); //에러가 발생한다.
}
}
위에 코드를 실행해보면Data2 d2 = new Data2()부분에서 에러가 발생하는데 이유는 Data2()는 기본 생성자가 아닌 매개변수가 있는 생성자이기 때문이다. 다음으로는 매개변수가 있는 생성자를 알아보자.
매개변수가 있는 생성자
위에 에러가 발생헀던 Data2()처럼,인스턴스를 생성할 때매개변수가 있는 생성자를 사용한다면 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 있어 보다 간결하고 직관적이다.
아래 예제를 보자.
class Car {
String color;
String gearType;
int door;
Car() {}
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
Car c2 = new Car("white", "auto", 4);
System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
}
}
Car 클래스에서 기본 생성자를 포함해서 매개변수가 있는 생성자도 만들어주었다.
main 클래스 CarTest를 보면Car c2 = new Car("white", "auto", 4);이 부분이매개변수가 있는 생성자를 이용한 인스턴스 생성이다.