01 - 10
01 - Java에서 print, printf, println의 차이점은 무엇인가?
- printf: 형식화된 출력으로, 출력 형식을 제어할 때 사용됩니다.
- print: 표준 출력으로, 줄 바꿈이 없습니다.
- println: 표준 출력으로, 줄 바꿈이 있습니다. 예를 들어, println("test")는 print("test\n")와 동일합니다.
예제:
package demo;
public class OutputExample {
public static void main(String[] args) {
System.out.print("테스트");
System.out.print("테스트\n");
System.out.println("테스트");
int value1 = 123;
double value2 = 456.789;
System.out.printf("첫 번째 값은%d이고, 두 번째 값은%.4f입니다", value1, value2);
}
}
/*
출력 결과:
테스트테스트
테스트
첫 번째 값은123이고, 두 번째 값은456.7890입니다
*/
02 - Java 프로그래밍 표준
Java 코드 스타일 도구 Google Java 프로그래밍 스타일 가이드 알리바바 Java 개발 매뉴얼 v1.2
03 - jar, war, ear 파일의 용도와 차이점
- jar: 개발 시 참조할 일반(JAVA) 클래스 및 리소스를 패키징하여 관리하기 쉽게 만듭니다.
- war: 완전한 웹 애플리케이션으로, 일반적으로 웹사이트나 웹 플랫폼이며 컨테이너에 배포됩니다.
- ear: 기업급 애플리케이션으로, 실제로 EAR 파일에는 WAR 파일과 여러 기업급 프로젝트의 구성 파일이 포함됩니다. 서버 미들웨어에서는 일반적으로 WebSphere 등이 EAR 파일을 사용합니다.
04 - Java 이스케이프 문자
1. 8진수 문자(\ddd)
ddd는 1~3자리 8진수를 의미하며, 범위는 '\000~\377'입니다.
2. 16진수 Unicode 문자(\uxxxx)
xxxx는 4자리 16진수를 의미하며, 해당하는 유니코드 문자 범위는 '0~65535'입니다.
3. 특수 문자
\" 큰따옴표
\' 작은따옴표
\\ 역슬래시
4. 제어 문자
\r 캐리지 리턴
\n 줄 바꿈
\f 폼 피드
\t 탭
\b 백스페이스
\s 공백
5. 구두점 문자
해당하는 16진수 Unicode 문자로 이스케이프할 수 있습니다. 예를 들어:
달러 기호 이스케이프: $ ==> u0024
왼쪽 괄호 이스케이프: ( ==> u0028
오른쪽 괄호 이스케이프: ) ==> u0029
별표 이스케이프: * ==> u002A
플러스 이스케이프: + ==> u002B
쉼표 이스케이프: , ==> u002C
마이너스 이스케이프: - ==> u002D
점 이스케이프: . ==> u002E
슬래시 이스케이프: / ==> u002F
물음표 이스케이프: ? ==> u003F
왼쪽 대괄호 이스케이프: [ ==> u005B
오른쪽 대괄호 이스케이프: ] ==> u005D
캐럿 이스케이프: ^ ==> u005E
왼쪽 중괄호 이스케이프: { ==> u007B
파이프 이스케이프: | ==> u007C
오른쪽 중괄호 이스케이프: } ==> u007D
......
예제:
package demo;
public class EscapeExample {
public static void main(String[] args) {
char escapeChar = '\\';
char octalChar = '\076';
String unicodeStr = "\u003F";
System.out.println("예제:" + escapeChar + " 예제:" + octalChar + " 예제:" + unicodeStr);
}
}
05 - Java 논리 연산자 &&와 &의 차이점
- "&&"는 단락(short-circuit) 기능이 있습니다. 만약 첫 번째 조건식이 false이면, 후속 조건식을 계산하지 않고 결과를 false로 판단합니다.
- "&"는 단락 기능이 없으며, 모든 조건식을 계산한 후 결과를 판단합니다.
"&&" 사용을 권장합니다. 예를 들어, "(5>8) && (9>3)"과 "(5>8) & (9>3)"의 결과는 모두 false이지만, "(5>8) && (9>3)"에서는 (5>8) 조건식만 계산됩니다.
06 - JDK 및 JRE 다운로드
푸단대학교 오픈소스 미러 사이트
- JDK and JRE: https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/
- jdk-8-x64windows: https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/windows/
화웨이 클라우드 미러
07 - Java 명명 규칙
대소문자 규칙
- 패키지 이름: 모든 문자를 소문자로 사용
- 클래스 이름: 첫 글자 대문자; 여러 단어일 경우 각 단어의 첫 글자를 대문자로
- 메서드, 변수, 객체 이름: 첫 글자 소문자; 이후 단어가 있을 경우 각 단어의 첫 글자를 대문자로
- 상수 이름: 모든 문자를 대문자로
- 인터페이스 이름: "I"로 시작; 여러 단어일 경우 각 단어의 첫 글자를 대문자로
- 인터페이스 구현 클래스 이름: 인터페이스 이름의 첫 글자 "I"를 제거하고 "Impl"로 끝냄; 여러 단어일 경우 각 단어의 첫 글자를 대문자로
패키지 이름 접두사 Java 패키지 이름의 고유성을 보장하기 위해, 일반적으로 고유한 도메인을 패키지 이름 접두사로 사용합니다.
- 회사 프로젝트(com): 회사에서 발의 및 완성한 프로젝트로, 저작권은 해당 회사에 속함. "com.회사명.프로젝트명.모듈명...."
- 팀 프로젝트(team): 팀에서 발의 및 완성한 프로젝트로, 저작권은 해당 팀에 속함. "team.팀명.프로젝트명.모듈명...."
- 개인 프로젝트(individual, indi): 개인이 발의했지만 혼자 완성하지 않은 프로젝트로, 공개 또는 비공개 가능하며, 저작권은 주로 발의자에게 속함. "indi.발의자명.프로젝트명.모듈명...."
- 개인 프로젝트(personal, pers): 개인이 발의하고 혼자 완성한 프로젝트로, 공유 가능하며, 저작권은 주로 개인에게 속함. "pers.개인명.프로젝트명.모듈명...."
- 비공개 프로젝트(private, priv): 개인이 발의하고 혼자 완성한 비공개 프로젝트로, 저작권은 개인에게 속함. "priv.개인명.프로젝트명.모듈명...."
08 - 오버라이딩(Overriding)과 오버로딩(Overloading)의 차이점
| 구분점 | 오버로딩 메서드 | 오버라이딩 메서드 |
|---|---|---|
| 매개변수 목록 | 반드시 변경해야 함 | 절대 변경할 수 없음 |
| 반환 타입 | 변경 가능 | 절대 변경할 수 없음 |
| 예외 | 변경 가능 | 줄이거나 삭제 가능, 새로운 예외나 더 넓은 범위의 예외를 throw할 수 없음 |
| 접근 제어자 | 변경 가능 | 더 제한적인 접근 제어를 적용할 수 없음(제한 완화는 가능) |
09 - Collection과 Collections의 차이점
Collection은 인터페이스로, Collection 계층 구조의 루트 인터페이스이며, 주로 사용되는 하위 인터페이스로 List와 Set 등이 있습니다. Collections는 클래스로, java.util 패키지에 속하며 Object의 하위 클래스입니다. 이 클래스는 Collection에서 작업을 수행하거나 Collection을 반환하는 정적 메서드로 완전히 구성됩니다.
10 - Java 고동시성 프로그래밍
- Java 고동시성 시스템 학습
- Java 고동시성 문제 해결 방법
11 - 20
11 - Java에서 "=="와 equals()의 차이점
"=="
- 기본 데이터 타입 변수의 경우, "값"이 같은지 직접 비교합니다.
- 참조 타입 변수의 경우, 객체의 주소를 비교합니다.
equals() 메서드
- 기본 데이터 타입 변수에는 사용할 수 없습니다.
- 참조 타입 변수의 경우, 기본적으로 객체의 주소를 비교합니다.
- String, Date 등의 클래스에서 equals() 메서드를 재정의하면 객체 내용을 비교할 수 있습니다.
12 - Java에서 equals() 메서드와 hashCode() 메서드의 차이점
equals() 메서드는 객체가 같은지 비교하는 데 사용되며, hashCode() 메서드는 객체 인스턴스의 해시 코드(해시 함수)를 계산하여 반환합니다.
- 두 객체가 equals()로 동일하다면, hashCode()도 반드시 동일합니다.
- 두 객체가 hashCode()로 동일하다면, equals()도 반드시 동일하지는 않습니다. 간단히 말해, equals() 메서드는 hashCode() 메서드가 일치하는 것을 기반으로 추가적인 판단을 수행합니다.
13 - Java의 instanceof 연산자
이항 연산자로, 연산자 앞에는 객체 인스턴스가, 연산자 뒤에는 클래스(인터페이스)가 위치합니다. instanceof 연산자는 앞의 객체가 뒤의 클래스(하위 클래스, 구현 클래스, 인터페이스)의 인스턴스인지 판단합니다. 그렇다면 true를, 그렇지 않으면 false를 반환합니다. instanceof 연산자를 사용하려면 다음 조건 중 하나를 만족해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다:
- 앞의 피연산자의 컴파일 타입과 뒤의 타입이 동일한 경우
- 앞뒤 피연산자 타입에 상속 관계가 있는 경우
package demo;
public class InstanceofExample {
public static void main(String[] args) {
Object obj = "안녕하세요, Java!"; // Object 클래스로 obj 객체를 선언하면 obj의 컴파일 타입은 Object이지만, 실제 타입은 String입니다
System.out.println("Object 클래스의 인스턴스인가요: " + (obj instanceof Object)); // Object 클래스는 모든 클래스의 슈퍼클래스입니다
System.out.println("String 클래스의 인스턴스인가요: " + (obj instanceof String)); // String 클래스는 Object 클래스의 하위 클래스입니다
System.out.println("Comparable 인터페이스의 인스턴스인가요: " + (obj instanceof Comparable)); // String 클래스는 Comparable 인터페이스를 구현합니다
System.out.println("Math 클래스의 인스턴스인가요: " + (obj instanceof Math)); // Math 클래스는 Object의 하위 클래스입니다
// String str = "안녕하세요, Java!";
// System.out.println("Math 클래스의 인스턴스인가요: " + (str instanceof Math)); // 컴파일 오류 발생
}
}
14 - 형변환
- 기본 데이터 타입 간 숫자 타입 간에서만 변환이 가능하며, 숫자 타입과 불리언 타입 간에는 변환이 불가능합니다.
- 참조 타입 간 상속 관계가 있는 두 타입 간에서만 변환이 가능합니다. 상속 관계가 없는 두 타입 간의 강제 형변환은 컴파일 오류를 발생시킵니다. 부모 클래스 인스턴스를 자식 클래스 타입으로 변환하려면, 해당 객체가 실제로는 자식 클래스 인스턴스여야 합니다(즉, 컴파일 타입은 부모 타입이고 실행 시 타입은 자식 타입). 그렇지 않으면 실행 시 ClassCastException 예외가 발생합니다. instanceof 연산자를 사용하여 두 타입 간에 상속 관계가 있는지 판별함으로써 예외 발생을 방지할 수 있습니다.
15 - 업캐스팅과 다운캐스팅
업캐스팅(Upcasting)
- 자식 클래스 참조 객체를 부모 클래스 타입으로 변환합니다. 즉, 자식 객체를 부모 객체로 변환합니다(여기서 부모 객체는 인터페이스일 수 있습니다)
- 업캐스팅은 명시적 형변환이 필요하지 않습니다
다운캐스팅(Downcasting)
- 부모 클래스 참조 객체를 자식 클래스 타입으로 변환합니다
- 다운캐스팅은 반드시 명시적 형변환이 필요합니다
package demo;
class Animal { // 부모 클래스
public String getName(String str) {
return "이름:" + str;
}
}
class Dog extends Animal { // 자식 클래스
public void doorKeeper() {
System.out.println("개가 주인의 집을 지키고 있습니다.");
}
}
interface ITree { // 인터페이스
public String getName();
}
class AppleTree implements ITree { // 인터페이스 구현
public String getName() {
return "나무: 사과나무";
}
public void getFruit() {
System.out.println("과일: 사과");
}
}
public class CastingExample {
public static void main(String[] args) {
// 클래스
Animal animal = new Dog(); // 업캐스팅, Dog 클래스 객체를 Animal 부모 클래스 객체에 할당
System.out.println(animal.getName("개"));
// animal.doorKeeper(); // 오류: 객체 인스턴스에 이 메서드가 없음
Dog dog = (Dog) animal; // 다운캐스팅, 클래스 객체를 자식 클래스 객체에 할당. 다운캐스팅은 업캐스팅 후에만 수행할 수 있는 작업입니다
dog.doorKeeper();
dog.getName("개");
// 인터페이스
ITree tree = new AppleTree(); // 인터페이스 업캐스팅
System.out.println(tree.getName());
// tree.getFruit(); // 오류: 객체 인스턴스에 이 메서드가 없음
AppleTree appleTree = (AppleTree) tree; // 인터페이스 다운캐스팅
appleTree.getFruit();
System.out.println(appleTree.getName());
}
}
16 - 주석
단일 행 주석: 두 개의 슬래시 "//"로 시작하여 행 끝에서 끝납니다. 다중 행 주석: 슬래시 하나와 별표 하나 "/*"로 시작하여 별표 하나와 슬래시 하나로 끝납니다. 단일 행 주석과 다중 행 주석은 서로 중첩될 수 있지만, 다중 행 주석 안에 다중 행 주석을 중첩할 수는 없습니다.
문서 주석: 코드의 외부 문서를 생성하는 데 사용됩니다. 다중 행 주석과 유사하게, 슬래시 하나와 별표 두개 "/**"로 시작하여 별표 하나와 슬래시 하나로 끝납니다. 공개 클래스, 인터페이스, 메서드 및 인스턴스 변수에 대해 문서 주석을 사용해야 합니다.
17 - Eclipse를 사용한 문서 생성 (javadoc)
소스 코드에 클래스, 메서드, 변수 등에 Javadoc 구문에 맞는 설명 정보를 추가하면, Javadoc 도구를 사용하여 설명 정보를 HTML 형식의 도움말 문서로 자동 생성할 수 있습니다.
Eclipse에서 문서를 생성하는 3가지 방법
- 프로젝트 목록에서 마우스 오른쪽 버튼을 클릭하여 Export 선택---》Java 아래의 Javadoc 선택---》Javadoc command에서 jdk의 javadoc.exe 디렉토리 선택, 사용자 지정 저장 경로 Destination 설정---》Finish를 클릭하여 문서 생성
- 메뉴 바에서 File---》Export 선택---》이후 단계는 방법 1과 동일
- 프로젝트 선택---》메뉴 바에서 Project---》Generate Javadoc 선택---》이후 단계는 방법 1과 동일
18 - Java 키워드
abstract 클래스 또는 멤버 메서드가 추상 속성을 가짐을 나타냄
assert 프로그램 디버깅에 사용됨
boolean 기본 데이터 타입 중 하나, 불리언 타입
break 블록에서 미리 빠져나감
byte 기본 데이터 타입 중 하나, 바이트 타입
case switch 문에서 사용되는 하나의 분기를 나타냄
catch 예외 처리에서 사용되며 예외를 잡는 데 사용됨
char 기본 데이터 타입 중 하나, 문자 타입
class 클래스
const 예약 키워드로 특별한 의미가 없음
continue 블록의 시작 부분으로 돌아감
default 기본값, 예를 들어 switch 문에서 기본 분기를 나타냄
do do-while 루프 구조에서 사용됨
double 기본 데이터 타입 중 하나, 배정밀도 부동소수점 타입
else 조건문에서 조건이 성립하지 않을 때의 분기를 나타냄
enum 열거형
extends 하나의 타입이 다른 타입의 하위 타입임을 나타냄(일반적으로 클래스와 인터페이스)
final 최종 속성을 설명하며, 클래스가 하위 클래스를 파생시킬 수 없거나 멤버 메서드가 오버라이드될 수 없거나 멤버 필드의 값이 변경될 수 없음을 나타냄. 상수를 정의하는 데 사용됨
finally 예외 상황을 처리하며, 실행될 가능성이 높은 문장 블록을 선언하는 데 사용됨
float 기본 데이터 타입 중 하나, 단정밀도 부동소수점 타입
for 하나의 루프 구조의 시작을 나타내는 키워드
goto 예약 키워드로 특별한 의미가 없음
if 조건문의 시작을 나타내는 키워드
implements 클래스가 주어진 인터페이스를 구현함을 나타냄
import 지정된 클래스나 패키지에 접근할 것임을 나타냄
instanceof 객체가 지정된 타입의 인스턴스인지 테스트하는 데 사용됨
int 기본 데이터 타입 중 하나, 정수 타입
interface 인터페이스
long 기본 데이터 타입 중 하나, 긴 정수 타입
native 메서드가 컴퓨터 관련 언어(C/C++/FORTRAN)로 구현됨을 나타냄
new 새 인스턴스 객체를 생성하는 데 사용됨
package 패키지
private 접근 제어 방식 중 하나: 비공개 모드
protected 접근 제어 방식 중 하나: 보호 모드
public 접근 제어 방식 중 하나: 공개 모드
return 멤버 메서드에서 데이터를 반환함
short 기본 데이터 타입 중 하나, 짧은 정수 타입
static 정적 속성을 가짐을 나타냄
strictfp FP_strict(단정밀도 또는 배정밀도 부동소수점) 표현식이 IEEE 754 산술 규격을 따름을 선언하는 데 사용됨
super 현재 객체의 부모 타입의 참조 또는 부모 타입의 생성자를 나타냄
switch 분기 문 구조의 시작을 나타내는 키워드
synchronized 코드 블록이 동기화되어 실행됨을 나타냄
this 현재 인스턴스 객체에 대한 참조를 가리킴
throw 예외를 발생시킴
throws 현재 정의된 멤버 메서드에서 발생할 수 있는 모든 예외를 선언함
transient 직렬화되지 않을 멤버 필드를 선언함
try 예외를 발생시킬 수 있는 코드 블록을 시도함
void 현재 멤버 메서드가 반환값이 없음을 선언함
volatile 두 개 이상의 변수가 동기화되어 변해야 함을 나타냄
while 루프 구조에서 사용됨
19 - Java 온라인 튜토리얼
- Java 튜토리얼
- Simple Java: https://www.programcreek.com/simple-java/
- Java 예제: https://www.programcreek.com/java-api-examples/
20 - 일부 Java 웹사이트
- Java World: http://www.javaworld.com/
- Program Creek: http://www.programcreek.com/