반응형
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; // 리터럴만 작성해도 에러 안남
- ex) float f = 5.0f; // f를 붙여서 써야 함.
문자형
- 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) 문자가 중간에 들어가 있다면 공백이나 탭을 구분자로 간주하여 구분자로 끊어서 한 단어씩 리턴한다.
반응형