JAVA
1. 자바 API(Application Programming Interface) 문서
자바에서 제공하는 API(Application Programming Interface)는 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의
모음을 말하며 라이브러리라고도 부릅니다. 이전에는 자바 개발도구를 설치할 때 함께 설치되었으나, 지금은 분리되어
따로 설치하거나, 사잉트를 이용해 확인할 수 있습니다.
자바에서 제공하는 API를 확인하려면, 검색 사이트에서 'java api doc'를 검색하면 문서를 확인할 수 있습니다.
자바는 방대한 API 문서를 제공하고 있습니다. API 문서를 잘 활용하면 개발 능력을 향상하는 데 도움이 됩니다.
2. java.lang 패키지
java.lang 패키지는 자바 프로그램의 기본적인 클래스를 담고 있는 패키지 입니다. 가령 Scanner를 사용하려 한다면
스캐너를 import해줘야 사용할 수 있었습니다. 그러나 System, String 등과 같은 클래스는 따로 선언 없이 사용이
가능했습니다. 그 이유는 기본으로 제공해 주는 java.lang 패키지에 속해 있었기 때문입니다.
클래스 | 용도 |
Object | 자바 클래스의 최상위 클래스로 사용 |
System | 시스템의 표준 입/출력 장치로부터 데이터를 입력받거나 출력하기 위해 사용 자바 가상 기계를 종료할 때 사용 |
String | 문자열을 저장하고 여러 가지 정보를 얻을 때 사용 |
StringBuffer/ StringBuilder |
문자열을 저장하고 내부 문자열을 조작할 때 사용 |
Math | 수학 함수를 이용할 때 사용 |
위 표와 같이 java.lang 패키지는 자바늬 다양한 기본 클래스들을 제공합니다.
Object 클래스
Object 클래스는 자바의 최상위 클래스입니다. 자바엥서 생성되는 모든 클래스는 생성될 때 상속을 하지 않아도 Object를
자동으로 상속 받게 되어있습니다. 따라서 클래스를 생성하면 Object가 가지고 있는 여러 메서드를 그대로 사용하거나
override하여 사용할 수 있게 됩니다.
Object 클래스가 지닌 대표적인 메서드는 다음과 같습니다.
메서드 | 설명 |
protected Object clone() | 객체 자신을 복사한 후 반환 |
boolean equals(Object obj) | 다른 객체와 자신이 가진 실제 값을 비교 |
int hashCode() | 객체의 hashCode 값을 반환 |
String toString() | 객체 자신의 저오를 반환 |
객체 비교 equals() 메서드
자바에서는 기본 데이터들의 동등 비교를 위해서 '==' 비교 연산자를 사용합니다. 하지만 객체에서의 의미는 조금 다릅니다
객체를 동등 비교할 경우, 해당 객체의 값을 비교하는 것이 아니라, 객체가 메모리에 있는 위치를 비교하게 됩니다. 따라서 참조형 데이터의 비교 연산에는 적절치 못하므로 객체의 데이터를 비교할 때는 equals() 메서드를 override하여 사용합니다. 대표적인 예로 String 클래스가 있습니다. String 클래스는 데이터를 비교할 때 equals를 사용해 비교합니다.
String은 객체형 데이터이기 때문에 문자열 데이터를 비교할 때 어떻게 값을 부여했느냐에 따라 동등 비교의 결과가 같거나 또는 다르게 나오는 것을 볼 수 있습니다. 그 이유는 객체를 동등 비교 연산자로 비교한다면, 그것은 객체가 지니고 있는
값의 비교가 아닌 객체가 위치하는 값의 비교가 되기 때문입니다.
객체 비교 equals()는 두 객체가 논리적으로 동일한 객체 라면 true를 그렇지 않다면 false를 리턴합니다.
문자열 중에서 영문을 비교할 때 대소문자로 인해 문제가 발생할 수 있습니다. 자바는 대소문자에 엄격한 언어입니다.
만약 같은 단어라 할지라도 equals()로 비교할 경우 대소문자가 다르다면 서로 다른 문자로 인식합니다.
이때, 대소문자를 무시하고 단어만으로 비교할 수 있는 방법이 있는데 equalsIgnoreCase() 메서드를 이용하는 방법 입니다. 해당 메서드는 대소문자 구분 없이 영문의 철자만 비교하여 값의 동등 여부를 얻을 수 있습니다.
객체 해시코드 hashCode() 메서드
사람은 태어나면 누구든지 주민등록번호를 부여받습니다. 주민등록번호는 사람에게 부여되는 고유번호 입니다.
자바 프로그래밍에서 new 키워드를 사용해 인스턴스를 만들 경우, 주민등록번호처럼 객체를 식별하는 하나의 정수값을
'hashCode'라고 부릅니다. hashCode()메서드는 그것을 반환하는 메서드입니다. 이는 HashMap 또는 HashSet에서 객체형 데이터를 저장할 때 equals() 메서드와 함께 동일한 객체인지를 판별하는 데 사용합니다.
hashCode()는 객체 비교의 처음 조건으로 두 객체가 같은 객체인지 비교할 때 사용합니다 해시코드 값이 다르면 다른 객체로 판단하고, 해시코드 값이 같으면 equals()메서드로 같은 값을 지녔는지 다시 비교합니다. 그러므로 hashCode() 메서드가 true가 나와도 equals()의 리턴 값이 다르면 다른 객체가 됩니다.
따라서 Hash 관련 컬렉션을 사용해 데이터를 저장할 경우, 해당 메서드들을 override하여 구현해 주어야 정확한 객체 비교를 할 수 있습니다.
HashSet은 배열과 마찬가지로 여러 데이터를 저장하는 자료 구조이며 'Collections Framework'에 속해 있기도 합니다.
해당 자료 구조는 데이터를 저장할 때 배열과 다르게 저장한 만큼 크기가 지정됩니다. 또한 중복 데이터가 저장될 경우
처음 데이터를 제외하고 중복을 무시하는 기능도 있습니다.
객체 문자 정보 toString() 메서드
toString() 메서드는 객체의 문자 정보를 변환해 주는 클래스입니다. print문을 사용해 객체를 출력할 경우, 해당 메서드가 자동으로 실행되어 객체의 정보를 반환해 주고 출력됩니다. 해당 메서드를 재정의해서 사용하면 원하는 객체의 정보를 쉽게 출력할 수 있습니다.
String 클래스
String 클래스는 문자열을 처리하는 객체형 데이터 타입입니다. 일반적으로 기본 데이터 타입들과 마찬가지로 문자열
데이터를 담은 간단한 형식으로 사용지만, 문자열을 처리하기 위한 다양한 기능들을 가지고 있습니다. String 인스턴스는
한 번 생성되면 그 값을 읽기만 하고 변경할 수 없습니다. String 클래스가 지닌 대표적인 메서드는 다음과 같습니다.
메서드 | 설명 |
int length() | 문자열의 길이를 반환 |
char charAt(int index) | 문자열을 하나의 단어 단어로 출력 파라미터로는 추출할 문자열의 위치를 받음 |
index indexOf(String ch) int indexOf(int ch) |
문자열에 포함된 단어 또는 문자열의 위치를 앞에서부터 검색했을 때 일치하는 위치의 인덱스 값을 반환(없을 경우에는 -1을 반환) |
String replace(변경할 문자, 변경 문자) | 단어 또는 문장에 있는 특정 단어를 변경 |
String substring(int beginIndex) | 문자열을 원하는 위치에서 자를 때 사용 입력된 시작 위치부터 문자열의 마지막까지 반환 |
String substring(int beginIndex, int endIndex) | 문자열을 입력된 시작 위치부터 마지막 위치 전까지의 값을 리턴 |
String 객체는 위 표에 기재된 것보다 더욱 다양한 기능들이 있으나 대표적으로 많이 사용되는 기능을 정리했습니다.
문자 추출 charAt() 메서드
문자열 클래스는 내부에서 데이터를 저장할 때, 문자 타입의 배열을 사용하여 입력한 문자열을 저장하고 있습니다.
따라서 원하는 위치의 문자를 문자열에서 추출할 수 있습니다.
문자열 찾기 indexOf() 메서드
indexOf() 메서드는 저장된 문자열 중에서 찾는 특정 단어 또는 문장의 시작 위치를 알려주는 메서드 입니다.
만약 찾는 단어가 없으면 해당 메서드는 -1을 반환합니다.
단어가 중복으로 있으면, indexOf() 메서드는 처음 검색되는 단어의 위치를 나타냅니다.
문자열 변환 replace() / replaceAll 메서드
replace() 또는 replaceAll 메서드는 특정 문자 및 문자열을 원하는 단어로 변경해 주는 메서드입니다.
replace보다 기능상의 이점이 있어서 replaceAll을 주로 사용합니다. 프로그래밍은 텍스트 형식의 데이터를 수정하는
것이 쉽지 않은데, replace기능은 원하는 텍스트 형식의 데이터로 쉽게 변경하는 데 도움을 줍니다.
replaceAll을 구현하는 방법은 다음과 같습니다.
replaceAll(변경 대상, 변경할 단어);
앞에는 변경 대상을 뒤에는 변경할 단어를 입력하여 원하는 대상을 변경합니다.
substring 메서드
substring 메서드는 원하는 위치에서 문자열을 잘라서 사용할 수 있는 메서드입니다. 입력된 문자열 중에서 특정 위치의
문자를 추출할 수 있습니다. substring 메서드는 다음과 같이 매개변수에 따라서 두가지 타입이 존재합니다.
substring(int beginIndex)
substring(int beginIndex, int endIndex)
인자로 beginIndex만 전달하면 beginIndex가 포함된 문자부터 마지막까지 추출하여 변환합니다.
인자로 beginIndex와 endIndex를 전달하면 beginIndex가 포함된 문자부터
endIndex 위치 전까지의 문자를 추출하여 반환합니다.
StringBuffer와 StirngBuilder
자바에서 문자열을 처리하는 변수 String 객체입니다. String 클래스는 최초 지정된 문자열 이후에 값이 추가되면 내부적으로 새로운 메모리를 할당해 새롭게 문자열을 등록합니다.
처음 문자열을 선언한 후 추가하면 기존의 메모리 주소가 아닌 새로운 주소에 추가된 문자가 저장됩니다. 따라서 문자열을 많이 사용할 수록 메모리 사용이 늘어나 메모리가 낭비될 수 있습니다. 이런 문제점을 해결하기 위해 가변 속성을 지닌
StringBuffer 또는 StringBuilder 클래스를 사용합니다. StringBuffer와 StringBuilder는 내부에 여유 공간을 두기 때문에
문자열을 합칠 때 메모리에 새롭게 생성하는 과정을 String보다 현저히 생략할 수 있습니다.
StringBuffer와 StringBuilder는 사용하는 기능에서 차이가 없으나 StringBuffer의 경우 스레드 환경에서 안정성 기능을 추가로 가지고 있습니다. 다만 스레드 환경이 아닌 경우에는 StringBuilder의 성능이 좋으므로 일반적인 프로그래밍에서는 StringBuilder를 사용하는 것을 권장합니다.
StringBuilder클래스가 지닌 대표적인 메서드는 다음과 같습니다.
메서드명 | 설명 |
append(String str) | 기존 문자열 뒤에 더하여 반환 |
delete(int start, int end) | 시작 위치부터 끝 위치 전까지 삭제 |
insert(int offset, String str) | 시작 위치부터 문자열을 삽입 |
reverse() | 문자열을 반대로 출력 |
Math 클래스
Math 클래스는 수학에서 자주 사용하는 상수들과 함수들이 미리 구현해 놓은 클래스로 자바에서 수학 계산이 필요할 때
주로 사용됩니다. 객체를 선언하지 않고 바로 사용할 수 있도록 해당 클래스가 제공하는 모든 메서드는 모두 정적 메서드로 이루어져 있습니다.
Math 클래스가 지닌 대표적인 메서드는 다음과 같습니다.
메서드 | 설명 |
int abs(int a) double abs(double a) |
절대값 계산 |
double ceil(double a) | 올림 계산 |
doublefloor(double a) | 버림 계산 |
double round(double a) | 반올림 계산 |
int max() double max() |
최대값을 구하는 계산 |
int min(int a, int b) double max(double a, double b) |
최소값을 구하는 계산 |
double random() | 랜덤값을 반환 |
Math.random()메서드를 사용하여 그냥 값을 받아 보면 출력 데이터의 범위는 다음과 같습니다.
0 <= x < 1
Math.random()메서드를 사용하면 0부터 1미만 사이에 존재하는 실수값 중 하나가 부여됩니다. 이대로 의미 있는 값으로
사용하기 힘들기 때문에 다음과 같은 과정을 거쳐야 합니다.
랜덤값에 곰셈을 하여 정수화합니다.
int randValue = (int)(Math.random()*30)
0 <= x < 30.0
값의 범위를 1부터 하기 위해서 곱셈 결과에 1을 더합니다.
int randValue = (int)(Math.random()*30)+1
최종 범위 : 1 <= x <= 30
다음과 같은 과정을 거치면 랜덤 함수는 1에서 30 사이의 값에서 특정 값을 반환하는 수식이 됩니다. 결과적으로 곱한
숫자가 최대값이 되고, 더하기 한 1이 최소값이 됩니다. 해당 수식은 공식과 같아서 외워서 사용하면 좋습니다.
Wrapper 클래스
프로그램에 따라 기본 타입의 데이터를 객체형으로 표현해야하는 경우가 있습니다, 이를 위해 자바에서는 기본 자료형을 객체로 다루기 위한 클래스를 제공하는데, 이러한 클래스를 'Wrapper클래스'라고 합니다. Wrapper 클래스라고 부르는 이유는 기본형의 데이터 타입을 클래스로 포장했기 때문입니다.
자바의 기본 자료형에 대응하여 제공되는 Wrapper 클래스의 종류는 다음과 같습니다.
기본 데이터 타입 | Wrapper 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Wrapper 클래스는 java.lang 패키지에 포함되어 있습니다. 정수형 데이터 int는 Integer로 문자형 데이터는 Character로
자신의 기본 타입과 이름이 다르며 나머지는 자신의 자료형 이름에서 첫 글자를 대문자로 변경합니다.
오토박싱(AutoBoxing)과 오토언박싱(AutoUnBoxing)
클래스를 사용할 때 객체를 선언한 후에 사용했지만 Wrapper 클래스도 데이터 타입이지만 기본적으로 클래스이기
때문에 객체를 선언해서 사용해야 합니다.
Integer num01 = new Integer(1); //JDK 1.9부터 사용하지 않도록 권고
또는
Integer num02 = Integer.valueOf(10);
위와 같이 Wrapper 클래스를 선언하여 사용합니다. 기본 타입의 데이터를 Wrapper 클래스의 인스턴스로 변환하는 과정을
'박싱(Boxting)'이라고 하고, 반대로 Wrapper 클래스의 인스턴스에 저장된 값을 기본 타입의 데이터로 꺼내는 과정을
'언박식(UnBoxting)'이라고 합니다. JDK1.5부터는 박싱과 언박싱을 필요한 상황에 자바 컴파일러가 자동으로 처리해 주는데, 이를 '오토박싱'과 '오토어박싱'이라고 부릅니다.
오토박싱은 다음과 같이 일반 변수처럼 선언하고 대입하여 사용합니다.
Integer num01 = 10; // 정수를 대입하여 객체 타입 데이터로 감싸줌
문자 타입 데이터를 숫자 타입의 데이터로 변환
프로그램을 개발하다 보면 외부로부터 데이터를 받는 경우가 종종 있습니다. 이러한 데이터 중에는 숫자로 표기되어 있지만 전송의 편의상 모든 데이터를 문자 또는 문자열 타입으로 전송하는 경우들이 있습니다. 이런 경우, 받는 쪽에서는 데이터 타입을 변경하여 사용해야 합니다. Wrapper 클래스에는 문자 타입의 데이터를 숫자(정수 또는 실수) 타입의 데이터로 변경할 수 있는 기능이 있습니다.
데이터 타입 | 문자형 => 숫자형 |
byte형 | Byte.parseByte("10"); |
short형 | Short.parseShort("10"); |
int형 | Integer.parseInt("100"); |
long형 | Long.parseLong("100"); |
float형 | Float.parseFloat("10.33"); |
double형 | Double.parseDouble("30.23"); |
boolean형 | Boolean.parseBoolean("true"); |
parse + 기본 타입 명의 메서드를 사용해 각각에 맞는 데이터 형태의 문자열을 변경할 수 있습니다.
3. java.util 패키지
java.util 패키지에는 프로그램을 개발하는 데 사용할 수있는 유용한 유틸리티 클래스가 포함되어 있습니다. 특히 날짜와 시간 정보를 제공해 주는 Date 클래스와 Calendar 클래스가 있습니다. 최근에는 날짜를 표현할 때 Date 클래스보다는 Calendar 클래스를 사용하는 것을 권장하고 있으며, Date 클래스는 많은 기능이 종료를 기다리고 있습니다.
Date 클래스 : 특정 시점의 날짜를 표현하는 클래스로 날짜롸 시간 정보를 저장
Calendar 클래스 : 달력을 표현한 클래스로 운영체제의 날짜와 시간 정보를 얻음
Calendar 클래스 선언
Calendar 클래스는 추상 클래스입니다. 따라서 다른 객체 선언처럼 new 키워드를 이용하여 선언하지 않고, 생성된 인스턴스를 받아오는 형식으로 선언됩니다. Calendar가 추상 클래스로 선언된 이유는 나라, 지역마다 날짜 및 시간 계산이 다르기 때문입니다.
Calendar cal = new Calendar(); //에러
Calendar cal = Calendar.gerInstance(); // ok
Calendar 클래스 속성
Calendar 클래스에는 여러 가지 상수 필드들이 존재합니다. 날짜를 표시하기 위해 자주 사용하는 값들을 상수화하여
관리합니다. 대표적으로 사용하는 상수값은 다음과 같습니다.
상수 필드 | |
YEAR, MONTH, DATE | 연도, 월(0-11),일(1-31)을 나타내는 상수 |
DAT_OF_MONTH | 현재 달의 몇 번째 날인지를 나타내는 상수(1-31) |
DAY_OF_WEEK | 현재 주의 몇 번째 날인지를 나타내는 상수(1-7), 1은 일요일을 의미 |
HOUR, MINUTE | 시(0-59), 분(0-59)을 나타내는 상수 |
SECOND,MILLISECOND | 초(0-59) 와 1/1000초를 나타내는 상수 |
HOUR_OF_DAY | 현재의 날의 시각을 의미하는 상수(0-23) |
AM_PM | HOUR가 정오보다 이전이면 0을 이후면 1의 값을 가지는 상수 |
WEEK_OF_MONTH | 현재의 달의 몇 번째 주인지를 나타내는 상수 |
WEEK_OF_YEAR | 현재 해의 몇 번째 주인지를 나타내는 상수 |
응용문제
1. 다음 코드에서 Object 클래스의 toString() 메서드를 재정의하여 User가 실행 결과와 같이 출력되도록 알맞은 코드를 작성해 보세요.
실행 코드
이름 : 김철수, 나이: 22
class User{
private String name;
private int age;
public User(String name, int age){
this.name = name;
this.age = age;
}
//코드 작성
@Override
public String toString(){
String str = "이름: "+this.name+", 나이: "+this.age;
return str;
}
public class UserExample{
public static void main(String[] args){
User user = new User("김철수",22);
System.out.println(user);
}
}
}
2. 다음 코드를 실행했을 때 콘솔 창에 출력되는 결과는 무엇입니까 ?
public class StringCompareExample{
public static void main(String[] args){
String sentence1 = "사과";
String sentence2 = new String("사과");
String sentence3 = "망고";
System.out.println(sentence1 == sentence2);
System.out.println(sentence2 == sentence3);
}
}
실행 결과 :
false
false
문자열 비교는 equals
3. 다음 빈 칸에 문자열 '100'을 정수로 변환하는 코드를 삽입하여 더하기 기능을 완성해 보세요.
public class ValueConverExample{
public static void main(String[] args){
String str = "100";
int data1 = 200;
int result = 0;
result = 100 +ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ;
System.out.println("숫자합 : "+result);
}
}
정답:
public class ValueConverExample{
public static void main(String[] args){
String str = "100";
int data1 = 200;
int result = 0;
result = 100 + Integer.parseInt(str);
System.out.println("숫자합 : "+result);
}
}
4. 1부터 30 사이의 숫자를 생성하여 숫자 맞추기 게임을 랜덤 함수를 사용해 만들어 보세요. (단, 숫자를 맞출 수 있는 기회는 10번 입니다.)
import java.util.Scanner;
public class UpDownGame{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int count = 0;
int matchValue = 0;
int value = 0;
matchValue = (int)(Math.random()*30)+1;
while(count < 10){
System.out.println("맞출 숫자 입력 : ");
value = sc.nextInt();
이어서 코드 작성
}
}
정답 :
import java.util.Scanner;
public class UpDownGame{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int count = 0;
int matchValue = 0;
int value = 0;
matchValue = (int)(Math.random()*30)+1;
while(count < 10){
System.out.println("맞출 숫자 입력 : ");
value = sc.nextInt();
count++;
if(value == matchValue) {
System.out.println("정답입니다! " + count + "번 만에 맞추셨습니다.");
break;
} else if(value < matchValue) {
System.out.println("Up");
} else {
System.out.println("Down");
}
if(count == 10) {
System.out.println("기회를 모두 사용하셨습니다. 정답은 " + matchValue + "였습니다.");
}
}
}
}
'javaboiii의 JAVA > JAVA 요약정리(멘토씨리즈)' 카테고리의 다른 글
JAVA - 17) 람다식 (0) | 2024.07.28 |
---|---|
JAVA - 16) 컬렉션 프레임워크(Collection Framework) (0) | 2024.07.27 |
JAVA -14) 예외처리 (0) | 2024.07.25 |
JAVA -13) 내부 클래스 (2) | 2024.07.24 |
JAVA -12) 추상 클래스와 인터페이스 (4) | 2024.07.23 |