데부한 2022. 5. 7. 10:53
반응형

 

Java 프로그램 작성법

  • Java 언어는 객체지향 프로그래밍 언어이기 때문에 클래스를 기반으로 프로그램이 구성된다.
  • mian() 메서드를 포함하는 클래스가 프로그램 실행을 위한 기본 클래스가 되고, main() 메서드부터 실행이 시작된다.
  • 하나의 소스 파일로 작성된 경우에는 그 소스 파일을 컴파일하고 실행시킨다.
  • 여러 개의 소스 파일로 작성된 경우에는 각각을 컴파일한 다음 main() 함수가 들어 있는 소스 파일을 실행시킨다.
  • Java 프로그램의 소스 파일 이름은 'public 클래스'의 이름과 같아야 한다.
반응형

기본 사항

주석(comments)

  • 주석은 프로그램 작성자가 붙인 프로그램의 설명문을 뜻하며 프로그램의 가독성과 이해도를 높이기 위한 방법으로 사용된다.
  • 한 줄 주석 : //
  • 여러 줄 주석 : /* ... */, /** ... */ 
    • 이 중에 /** ... */ 이 주석은 소스 코드 가장 앞부분에 사용하는데 'javadoc'이라는 프로그램을 이용하여 소스 코드에 대한 매뉴얼을 자동으로 생성하고자 할 때 사용된다.

식별자(identifier)

  • 클래스, 변수(필드) 또는 메서드의 이름을 식별자라고 한다.
  • 식별자 규칙
    • 대소문자 구분
    • 길이 제한 없음. 하지만 너무 긴 식별자를 사용할 경우 프로그램의 가독성을 해친다.
    • 영어 대소문자, 한글, 숫자, 언더스코어(_), 달러($) 문자 등을 사용할 수 있으나 숫자로는 시작할 수 없다.
    • 변수나 필드 식별자의 경우에는 자료형을 표시하기 위해 접두어를 붙이기도 한다. → 헝가리안 표기법
    • Java에서 미리 정한 예약어(키워드)는 식별자로 사용할 수 없다.
    • 일반적으로 단어의 첫 글자는 대문자로, 나머지는 소문자로 작성한다.
    • 여러 개의 복합 단어를 사용할 경우 각 단어의 첫 글자를 대문자로 하고 나머지 글자는 소문자로 한다.
    • 클래스 이름의 첫 글자는 대문자, 필드와 변수 및 메서드 이름의 첫 글자는 소문자

리터럴(literal)

  • 변수나 필드에 지정할 수 있는 각 자료형의 실제값을 리터럴이라 한다.
반응형

 

자료형

  • 변수, 필드나 메서드 등은 정해진 자료형(data type)으로 선언되며 자료형에 따라 변수나 필드의 경우에는 저장될 수 있는 값, 메서드의 경우에는 리턴할 수 있는 값의 종류 및 적용 가능한 연산이 결정된다.
  • 자료형
    • 기본형(primitive type) : 정해진 자료형의 값 자체
    • 참조형(reference type) : C의 포인터와 같이 실제값이 저장된 메모리 주소 이용

기본형

정수형

  • byte, short, int, long은 각각 1byte, 2byte, 4byte, 8byte를 차지한다.

실수형

  • 소수점이 있는 숫자를 저장한다.
  • float 타입의 길이는 4byte, double 타입의 길이는 8byte이다.
  • 실수형 리터럴에는 특별한 의미를 갖는 리터럴로 POSITIVE_INFINITY(양의 무한대), NEGATIVE_INFINITY(음의 무한대), NaN(Not a Number) 등이 있다.
  • 실수형 리터럴을 직접 사용할 경우 double형 리터럴로 간주하기 때문에 주의가 필요하다.
    • ex) float f = 5.0f;   // f를 붙여서 써야 함.
           double d = 5.0; // 리터럴만 작성해도 에러 안남

문자형

  • 1개의 문자를 표현하며, 단일 따옴표를 사용한다.
  • 문자형에는 2byte 길이의 char형이 있다.
  • 문자 코드로는 ASCII가 아닌 2byte 길이인 UNICODE를 사용한다.
  • char형은 정수형과 호환이된다. char형은 부호 없는 정수로 취급되며 표현 범위가 0~65536이다.

논리형

  • 1byte 길이의 boolean형
  • 논리형은 참 또는 거짓을 표현하기 위한 자료형이다.
  • 리터럴은 true, false 두 개 밖에 없다.
  • Java에서는 오직 boolean형만이 참 또는 거짓을 표현할 수 있다.

참조형

  • 기본형을 제외한 모든 자료형을 참조형이라 한다.
  • 참조값(주소)을 가지는 자료형이며 참조형 변수는 저장 공간에 참조값을 저장한다. 즉 실제 데이터는 별도의 공간에 저장되어 있고 주소를 통해 그 안에 담긴 값을 가져온다.

자료형의 변환(형변환: type conversion)

  • Java의 특징 중 하나인 엄격한 자료형 검사는 값과 자료형이 일치하지 않을 경우에 오류가 발생하거나 형변환이 일어난다.
  • 크기가 작은 타입에서 큰 타입으로는 자동으로 형변환한다.
    • byte → short → int → long → float → double
  • 크기가 큰 타입에서 작은 타입으로 자동 형변환이 안 되는 이유는 자료의 손실이 일어날 수 있기 때문이다.
// 묵시적 형변환
float f = 5.0f;
double d = f;
  • 묵시적 형변환은 컴파일 시 컴파일러가 알아서 처리해주는 자동 형변환이다.
  • 프로그래머가 강제로 형변환을 명시하는 건 '명시적 형변환'이라 한다.
//명시적 형변환
int a = 3;
float f = (float)a;
double d;
f = (float)d;
  • '(자료형)' 형태의 형변환 연산자를 사용하면 강제적인 형변환이 일어나고, 컴파일러가 오류를 발생시키지 않는다.
  • 다만 자료의 손실이 발생할 수 있는 경우가 있으니 주의해야 한다.
반응형

 

변수와 상수

  • 변수(variable) : 값이 계속 변경될 수 있는 변수
  • 상수(constant) : 값이 변하지 않는 특별한 변수

상수의 선언 및 사용

  • 상수는 리터럴 자체로 사용하거나 'final' 키워드를 이용해 정의한다.
final int nConst = 3;
반응형

 

연산자

산술 연산자

  • 이항 연산자
    • a+b, a-b, a*b, a/b, a&b
    • %는 모듈로(modulo) 연산자라고 하며 a를 b로 나눈 나머지를 구한다.
  • 단항 연산자
    • +a : 부호 바꾸지 않음
    • -a : 부호 반대로 바꿈
    • b = ++a : a 값을 1 증가시키고 그 결과를 b에 저장
    • b = --a : a 값을 1 감소시키고 그 결과를 b에 저장
    • b = a++ : a 값을 b에 저장하고 a 값을 1 증가시킴
    • b = a-- : a 값을 b에 저장하고 a 값을 1 감소시킴

비교 연산자(관계 연산자)

  • 두 개의 피연산자를 다양하게 비교하기 위한 연산자
  • 대소 비교의 경우는 숫자 자료형을 가진 피연산자에게만 적용
  • 동등 비교의 경우에는 어떠한 자료형이든 가능하다.
  • instanceof 연산자는 참조 자료형인 경우에만 적용 가능

논리 연산자(조건 연산자)

  • boolean형의 값을 가질 수 있는 자료형에 대해서만 적용 가능함
  • a && b : a와 b가 둘 다 true일 때만 ture이고 그 외에는 false. 만일 a가 false이면 b를 참조하지 않는다. → b가 ture이던 false이던 a가 false면 무조건 false이기 때문에
  • a || b : a와 b가 동시에 false일 때만 false이고 그 외에는 true. 만일 a가 true이면 b를 참조하지 않는다.
  • a & b : a와 b가 동시에 true일 때만 true이고 그 외에는 false이다. 항상 a와 b를 참조한다.
  • a | b : a와 b가 동시에 false일 때만 false이고 그 외에는 true이다. 항상 a와 b를 참조한다.
  • a ^ b : a와 b가 다르면 true, 같으면 false이다.
  • !a : a가 true이면 false, false이면 ture
  • a = b ? c : d :b가 true이면 a에 c를 대입하고, b가 false이면 a에 d를 대입
반응형

 

제어문

  • 명령문 : 연산을  하거나 실행 순서를 제어하기 위한 문장

블록

  • 하나 이상의 명령문이나 변수 선언문, 클래스 정의, 메서드 정의 등 중괄호({})로 묶어 놓은 것을 블록(block)이라 한다.
  • 블록은 중첩이 가능하고 중첩 깊이의 제한은 없다.

레이블

  • 명령문이나 블록 앞에는 레이블(lable)을 붙일 수 있다.
  • 레이블의 이름은 식별자로서 변수 이름처럼 정의하면 된다.
  • 레이블이 붙은 블록 내부에서는 break문이나 continue문을 이용하여 블록을 빠져나갈 수 있다.
  • 변수 선언문이나 클래스 선언문에는 레이블을 붙일 수 없다.
레이블 이름 : 명령문 블록
레이블 이름 : 블록

명령행 매개변수 사용하기

  • 명령행 매개변수 : 프로그램을 실행시킬 때 프로그램 이름 뒤에 나열하는 매개변수
c:\>java TestJava Kim 30
  • 위의 예제에서는 'Kim'과 '30'이 명령행 매개변수이다.
  • 이 명령형 매개변수는 main() 메서드의 괄호 안에 있는 args[]로 전달된다.
// 클래스 생략
public static void main(String args[]) {
	System.out.println(args[0]); // Kim
}

if-else문

  • if-else문은 주어진 조건에 따라 명령문을 분기하는 역할을 한다.
  • if 뒤에 주어지는 조건이 true일 경우 if 블록으로 분기, false일 경우 else 블록으로 분기
int a = 5;
if(a > 10) {
	System.out.println("a는 10보다 크다.");
} else if(a < 3) {
	System.out.println("a는 3보다 작다.");
} else {
	System.out.println("a는 10보다 같거나 작고 3보다 같거나 크다.");
}

switch문

  • if-else문처럼 명령문을 분기하는 역할을 한다.
  • 다중 선택 구조이며 case 조건은 정수(long 제외)와 호환되거나 String 값을 줘야 한다.
  • 각 case마다 끝에는 break문을 사용해야 한다. break를 의도적으로 사용하지 않는 경우도 있는데 break가 없을 경우 조건에 맞는 case부터 break를 만나거나 switch가 종료되기 전까지의 코드가 모두 실행된다.
int n = 15;

switch(n) {
	
    case 10 : 
    	System.out.println("10");
        break;
    case 20 : 
    	System.out.println("20");
        break;
    case 30 :
    	System.out.println("30");
        break;
    default :
    	System.out.println("숫자");
        break;
}

 

반복문

  • 주어진 조건이 true일 경우 블록으로 묶인 명령어를 반복해서 실행
  • for, while, do-while문

for문

for(초기화식; 탈출 조건; 반복식) 명령문

// 초기화식은 오직 한번만 실행
// 초기화식에 있는 변수가 반복식을 수행하면서 탈출 조건이 될때까지 계속 반복적으로 실행된다.

// 1부터 10까지 반복문을 사용해 더하는 코드
int nSum = 0;
for(int i = 1; i <= 10; i++) {
	nSum += i;
}

for-each 구문(JDK 1.5X 이상 버전에서만 지원)

  • for문을 좀 더 간단하게 변형
// arr의 값을 element라는 변수에 담아 출력하는 반복문

int[] arr = { 3, 10, 5, 6, 1 };

for(int element : arr) {
	System.out.println(element);
}

while문

while(탈출 조건) 명령문

// for문과 똑같이 1에서부터 10까지의 정수 합을 구하는 프로그램
int nSum = 0;
int i = 1;
while(i <= 10) {
	
    nSum += i;
    i++;
}

break문

  • 반복문을 강제로 빠져나갈 때 사용
  • break를 만나면 바로 반복문이 종료되고 그다음 명령문으로 이동한다.
  • 반복문 외 일반적으로 블록을 빠져나갈 때에도 사용된다. 하지만 이런 경우에는 블록에 레이블을 지정해야 하고, break문 뒤에 빠져나가고자 하는 현재 블록의 레이블을 붙여주어야 함.

continue문

  • continue문을 만나면 이후 명령문을 무시하고 루프의 처음으로 돌아간다.
  • 레이블과 함께 사용할 수 있지만 continue문은 레이블과 상관없이 항상 반복문 내에 포함되어 있어야 한다.
반응형

 

변수의 종류와 유효범위

  • 변수 종류
    • 객체가 소유하는 non-static 필드
    • 클래스에 속한 객체들이 공유하는 클래스 변수(static 필드)
    • 메서드나 블록에서 정의된 지역 변수
    • 메서드의 매개변수(인자 또는 파라미터)
  • 필드는 원칙적으로 객체가 선언된 블록에서 객체와 함께 사용될 수 있다.
  • 클래스 변수는 클래스를 참조할 수 있는 블록에서 사용될 수 있다.
  • Java의 모든 변수는 사용범위가 일정한 구역으로 제한되어 있는데 그러한 구역을 변수의 유효범위라고 함
  • 지역 변수의 경우 지역 변수를 선언한 블록 내에서만 사용이 가능하다.
  • 전역 변수의 경우 해당 소스 파일 내, 어디든지 사용이 가능하다.
반응형

 

배열

  • 같은 자료형의 데이터를 연속적으로 모아 놓은 자료구조
  • 배열에 속한 하나의 데이터를 원소 또는 컴포넌트라고 한다.
  • Java에서 배열은 참조형으로 분류된다.
  • 숫자 인덱스(첨자)를 사용하여 특정 원소를 다룬다.

배열의 선언

  • 규칙
    • 배열은 선언한 뒤 초기화나 생성의 과정을 거쳐야만 사용할 수 있다.
    • 배열을 선언할 때 배열의 크기를 지정할 수 없다.  ex)int a[10]; 오류
    • 다차원 배열은 255차원까지 선언할 수 있다.
//1차원 배열의 선언
int arr1[];
int arr2;
int arr3[10]; // 오류
arr1[0] = 1; // 오류, 초기화나 생성 전에 배열 사용 못함

//2차원 배열 선언
int arr4[][];
int[][] arr5;
int[] arr6[]; // 오류는 안나지만 썩 좋은 표현은 아님

배열의 초기화 및 생성

  • 배열의 초기화 : 배열을 선언하고 초기값을 지정하는 것
  • 배열의 생성 : 배열이 사용할 메모리 공간을 확보하는 것
  • 배열을 초기화시키면 자동으로 메모리 영역을 할당받게 된다.

배열의 초기화

// 1차원 배열의 초기화
int arr1[] = {1, 2, 3, 4, 5};
int[] arr2 = {1, 2, 3, 4, 5};

// 2차원 배열의 초기화
int arr3[][] = {{1, 2, 3}, {4, 5, 6}};
int[][] arr4 = {{1, 2, 3}, {4, 5, 6}};

int arr5[];
arr5 = {1, 2, 3, 4, 5}; // 오류, 선언과 동시에 초기화가 되어야 함

배열의 생성

// 배열의 생성은 초기화 없이 메모리 영역만 할당해준다.

// 1차원 배열의 생성
int arr1[] = new int[5];
int[] arr2 = new int[5];
int arr3[];
arr3[] = new int[5];

// 2차원 배열의 생성
int arr4[][] = new int[3][2];
int[][] arr5 = new int[3][2];
  • 생성된 배열은 따로 초기화하지 않아도 원소가 숫자형인 경우에는 0으로, 참조형인 경우에는 null로 초기화된다.

배열의 크기

  • 배열의 크기는 '배열이름.length'를 이용해서 얻을 수 있음
  • n차원 배열의 경우 '배열이름[]...[].length'를 사용
int arr1[] = new int[5];
for(int i = 0; i < arr1.length; i++) {
	arr1[i] = i;
}
반응형

 

문자열

  • 문자열을 다루기 위한 String이라는 클래스 제공
  • 참조형

문자열의 생성 및 초기화

String str1 = "java";
String str2, str3;
str2 = "java2";
str3 = str2;

// String 클래스 생성자를 이용하여 초기화 가능
String str4 = new String("java");

+ 연산자

  • 문자열에서 '+' 연산자의 의미는 문자열을 연결한다는 의미이다.
  • 또 문자열뿐만 아니라 다른 기본형이나 참조형과의 연산도 가능하게 해 준다.
  • + 연산자를 사용할 경우 기본형이거나 다른 참조형의 피연산자 값을 문자열로 자동으로 변환해준다.
String str1 = "java";
String str2 = " application";
String str3 = str1 + str2;
str3 = "java" + 2; // "java2"

System.out.println, System.out.print

  • System.out.println() 메서드는 표준 출력 스트림이 제공하는 메서드이다.
  • Java에서의 모든 입출력은 '스트림(stream)'이라는 클래스에 의해 이루어진다.
  • 스트림 중에서 표준 출력을 담당하는 출력 스트림이 System.out이다.
  • 출력 메서드 중에서 println()과 print() 메서드가 대표적으로 많이 사용된다.
    • print() 메서드는 단순히 출력만 하고, println()은 출력 후 줄 바꿈이 된다.
    • 두 개의 메서드는 내부적으로 모든 매개변수를 문자열로 반환하여 출력하기 때문에 문자나 문자열 외에 다른 자료형을 넘겨주어도 출력이 가능하다.
반응형

 

Scanner 클래스를 이용한 간단한 입출력

  • Scanner 클래스를 사용하려면 'java.util' 패키지를 import 해야 한다.
  • import <사용할 패키지 이름>.<클래스 이름>;
import java.util.Scanner;

문자열 입력과 출력

  • Scanner 클래스를 이용하여 문자열을 입력받을 때는 줄 단위로 입력받는다. 즉 '엔터키'를 누를 때까지 입력된 문자열을 입력 받는다.
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
	System.out.println(sc.nextLine());
}
  • hasNextLine() : 입력이 계속되는지 끝났는지를 확인하는 메서드
  • nextLine() : 입력된 문자열을 리턴해주는 메서드
  • 사용자가 다른 문자열을 입력하는 대신 'ctrl-c'나 'ctrl-z'를 입력하면 hasNextLine() 메서드는 false를 리턴하게 되고 프로그램이 종료된다.

정수형 숫자의 입력과 출력

Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()) {
	System.out.println(sc.nextInt());
}
  • Scanner 클래스를 이용하여 정수형 숫자를 입력받으려면 hasNextInt() 메서드와 nextInt() 메서드를 사용한다.
  • nextInt()는 입력된 줄 전체를 한꺼번에 리턴하지 않고 공백 문자나 탭(tab) 문자가 중간에 들어가 있다면 공백이나 탭을 구분자로 간주하여 구분자로 끊어서 한 단어씩 리턴한다.

 

반응형