본문 바로가기

Study/개발일지

[백엔드온라인TIL] java 학습 9일차

자바 교재를참고하여 자바에 대해 전반적으로 복습을 하는 시간을 가졌다.

 

jvm, 자바의 특징, 연산자, 제어문, 반복문, 클래스, 객체, 생성자 등을 복습하였다.

 

자바 가상머신 

 

Java Virtual Machine의 줄임말.

직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다.

Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java 를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다.

즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.

 

자바의 특징 

 

운영체제에 독립적 - 자바응용프로그램은 JVM과 통신하고 JVM이 응용프로그램으로부터 전달받은 명령을 운영체제가 이해할 수 있도록 변환하여 전달 

객체지향언어 - 상속, 캡슐화, 다형성

배우기쉽다 - 간결하고 명료한 설계

자동메모리관리  - 가비지컬렉터 가 자바 프로그램 실행시 메모리 관리

네트워크와 분산처리를 지원 - 다양한 네트워크 프로그래밍 라이브러리를 통해 프로그램 개발 용이

멀티쓰레드를 지원 - 여러쓰레드에대한 스케쥴링을 자바 인터프린터가 담당

동적 로딩을 지원  -실행시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용 

 

상수란?

상수(constant) 변수와 마찬가지로 '값을 저장할 수 있는 공간'이지만, 변수와는 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다.

선언 방법은 변수와 동일하고, 변수의 타입 앞에 'final'만 붙여주면 된다.

리터럴이란?

우리가 원래 알고 있던 상수의 의미가 리터럴이라고 생각하면 된다. 그 자체로 값을 의미하는 것을 상수라고 한다.

상수와 의미가 같은데 리터럴이라고 정의한 이유는 프로그래밍에서 상수의 의미를 위와 같이 정의했기 때문이다.

 

많은 사람들이 용어를 어려워하는데 전혀 어려워할 이유가 없다.

변수(variable) 하나의 값을 저장하기 위한공간.(변경 가능)

상수(constant) 값을 한번만 저장할 수 있는 공간.(변경 불가능)

리터럴(literal) 그 자체로 값을 의미하는 것.

int year = 2014;

final int Max_value = 100;

 

int 변수타입

year 변수

2014 리터럴

Max_value 상수

100 리터럴

 

 

기본형 변수(Primitive Variable)

int number = 1;

실제 값을 저장하며 아래와 같이 8가지가 있다.

  • boolean
  • char
  • byte, short, int, long
  • float, double

특징은 다음과 같다.

  • 산술 연산이 가능함.
  • null로 초기화 할 수 없음.

 

참조형 변수(Reference Variable)

Integer number = new Integer(1);

어떤 값이 저장되어 있는 주소를 값으로 가진다. 8개의 기본형을 제외한 나머지 모든 타입

ex> Integet, Boolean, String....

특징은 다음과 같다.

  • 산술 연산 불가
  • null로 초기화 할 수 있음.

 

연산자 (Operator) 정의

  • 프로그램에서 데이터를 처리하여 결과를 산출하는 것을 연산(operation)이라 한다.
  • 연산에 사용되는 표시나 기호를 연산자(operator)라고 한다.
  • 연산되는 데이터는 피연산자(operand)라고 한다.
    예) 산술연산 +, -, *, /, %

연산자의 종류

자바에서 제공하는 연산자의 종류는 아래의 표와 같습니다.

종류 연산자 우선순위
증감 연산자 ++, -- 1순위
산술 연산자 +, -, *, /, % 2순위
시프트 연산자 >>, <<, >>> 3순위
비교 연산자 >, <. >=, <=, ==, != 4순위
비트 연산자 &, |, ^, ~ ~만 1순위, 나머지는 5순위
논리 연산자 &&, ||, ! !만 1순위, 나머지는 6순위
조건(삼항) 연산자 ?, : 7순위
대입 연산자 =, *=, /=, %=, +=, -= 8순위

 

 

지금부터 각각의 연산자에 대해 구체적으로 알아보도록 할까요?

 

증감 연산자

증감연산자는 피연산자의 값을 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단위의 연산처리를 하며 자료의 가공을 위해 오른쪽 또는 왼쪽으로 이동하여 값에 대한 변화를 일으키는 연산자입니다.

구분 연산자 설명
시프트 연산자 >> bit값을 오른쪽으로 이동 (빈 자리는 부호값으로 대입) 한다.
<< bit값을 왼쪽으로 이동 (빈 자리는 0으로 대입) 한다.
>>> bit값을 오른쪽으로 이동 (빈 자리는 0으로 대입) 한다.
// 쉬프트 연산자 >>, <<, >>>        
int x = 64;   // -64;
int n = 2;        
System.out.println("x >> n = " + (x >> n)); // 나눗셈, (x / 2^n)
System.out.println("x << n = " + (x << n)); // 곱셈,  (x * 2^n)
System.out.println("x >>> n = " + (x >>> n));

System.out.println("x >> 34 = " + (x >> 34));    // x / 2^(n % 32)
System.out.println("x << 34 = " + (x << 34));
System.out.println("x >>> 34 = " + (x >>> 34));

 

비교 연산자

변수나 상수의 값을 비교할 때 쓰이는 연산자로서 결과가 항상 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 = new int[2][3];   // 2차원 배열생성 (2차원 배열의 저장공간 할당)

 

(방법2) 배열의 선언과 생성을 한줄로 합쳐서 사용

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

 

cf)  2차원 배열의 선언방법은 아래 두가지 방법이 모두 가능함

  1.  2차원 배열 선언방법1 :  int[ ][ ] num;
  2.  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); 이 부분이 매개변수가 있는 생성자를 이용한 인스턴스 생성이다.

728x90