브래의 슬기로운 코딩 생활
JAVA 프로그래밍 3주차 정리 본문
필기
깃 많이 쓴다
인텔리제이 한글이 나오지 않을 때
쉬프트 두번 - VM options - -Dfile.encoding=UTF-8
패키지: 연관된 클래스, 인터페이스 등과 서브 패키지의 모음
함수: 중복 코드를 묶어서 사용
자료구조: 자료를 구조화 하는 방법
클래스: 자료구조 + 필드 + 메소드 (함수 + 생성자)*
객체 초기화: 생성자
- 매개변수 없는 디폴트 생성자 / 클래스이름()
- 매개변수 있는 편집된 생성자
객체 생성
- 클래스명 객체명 = new 생성자 함수;
객체지향언어 : 클래스로부터 객체를 만들어 사용
편집된 생성자(){
this(); // 디폴트 생성자 호출
...
}
생성자가 없는 경우 컴파일러가 디폴트 생성자를 추가하여 호출
스택: Last In First Out
큐: First In First Out
변수의 반대맛 = 리터럴
자바 API 문서 사이트
https://docs.oracle.com/en/java/javase/17/docs/api/index.html
API = 애플리케이션 프로그래밍 인터페이스 (함수 설명서)
추상 메소드: 메소드 선언으로만 구성된 메소드, body가 없는 메소드
- abstract가 필요함
이론 (PPT)
자료형(Data Type)
정의
• 처리하고 저장하고자 하는 자료의 형태를 나타내거나 사용 의도를 지정하는 프로그래밍 요소(예약어 또는 식별자)
• 자료의 구조와 개념, 가질 수 있는 값, 그리고 행할 수 있는 연산 등을 정의한 프로그래밍 요소
종류
기본 자료형 (primitive data type)
- 효율적인 프로그래밍을 위해서는 사용 빈도가 높은 자료들을 위한 자료형을 프로그래밍 언어 시스템에서 기본적으로 제공하는 것이 바람직하다.
- 프로그래밍 언어가 기본적으로 제공하는 자료형, 즉 시스템 정의 자료형을 의미한다.
- 숫자형 (정수형, 실수형), 문자형, 논리형
객체 참조형(object reference type)
- 특별한 목적으로 기본 자료형을 활용하여 정의한 자료형
- 배열형, 클래스형, 인터페이스형, 열거형
주의
- 기본형 변수는 선언과 동시에 자료를 저장하기 위한 기억 공간이 할당된다.
- 참조형 변수는 선언할 때 참조하는 객체 자체에 대한 기억공간을 할당 받는 것이 아닌 참조형 변수를 위한 기억공간만을 할당받는다.
기본형
정수형
- 2의 보수를 사용함
- 자료형의 크기가 고정되어 있음 : 기계 독립성
IntegerType.java
public class IntegerType {
public static void main(String[] args) {
int intVar = 1000000;
long longVar = intVar;
System.out.println(intVar * intVar); // -727379968
System.out.println(longVar * intVar); // 1000000000000
}
}
실수형 (부동소수점)
- IEEE 754-1985에 정의된 표준을 따름
- double : 64bit , float : 32bit
- 부동소수점 정확한 연산을 수행하기에는 부적합하기 때문에 금융권과 같은 곳에서는 java.math.BIGDecimal 클래스를 사용한다.
DoubleToLong.java
public class DoubleToLong {
public static void main(String[] args) {
double dnum = Double.MAX_VALUE;
System.out.println(dnum); // 1.7976931348623157E308
System.out.println(Long.toHexString(Double.doubleToLongBits(dnum))); // 7fefffffffffffff
System.out.println(-(Double.MAX_VALUE)); // -1.7976931348623157E308
System.out.println(Long.toHexString(Double.doubleToLongBits(-(Double.MAX_VALUE)))); // ffefffffffffffff
System.out.println(Double.MIN_VALUE); // 4.9E-324
System.out.println(Long.toHexString(Double.doubleToLongBits(Double.MIN_VALUE))); // 1
System.out.println(-(Double.MIN_VALUE)); // -4.9E-324
System.out.println(Long.toHexString(Double.doubleToLongBits(-(Double.MIN_VALUE)))); // 8000000000000001
}
}
BigDecimalTest.java
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args) {
float f = 1.2345678901234567890f;
double d = 1.2345678901234567890d;
BigDecimal b = new BigDecimal("1.2345678901234567890");
System.out.println(String.format("float %%f: %.20f", f)); // float %f: 1.23456788063049320000
System.out.println(String.format("double %%f: %.20f", d)); // double %f: 1.23456789012345670000
System.out.println(String.format("BigDecimal %%f: %.20f", b)); // BigDecimal %f: 1.23456789012345678900
}
}
PrecisionTest.java
import java.math.BigDecimal;
public class PrecisionTest {
public static void main(String[] args) {
double doubleVar1, doubleVar2, diff;
BigDecimal bd1 = new BigDecimal(1.0);
BigDecimal bd2 = new BigDecimal(Double.toString(0.9));
BigDecimal bdDiff = new BigDecimal(0.0);
doubleVar1 = 1.0;
doubleVar2 = 0.9;
diff = doubleVar1 - doubleVar2;
System.out.println(diff); // 0.09999999999999998
bdDiff = bd1.subtract(bd2);
System.out.println(bdDiff.toString()); // 0.1
}
}
문자형
char : 16bit Unicode 사용, UTF-16BE
- 문서 데이터 호환성이 높아짐, 제작된 소프트웨어의 지역화가 용이하다
- JVM 내부에서는 UTF-16BE를 사용한다
- '\uHHHH' (H는 16진수)로 표현 가능
참고
- 문자열 전송/수신하기 위해 직렬화할 때 변형된 UTF-8을 사용한다
- DataInput, DataOutput 인터페이스 구현체에서는 문자열을 기록하거나 읽어들일 때 이
변형된(modified) UTF-8을 사용한다
논리형
boolean
- true, false 중 하나의 값만을 가짐
- 다른 유형으로 변환이 안됨 (형변환 금지)
참조형(object reference type)
정의
- 객체를 가르키는 형
종류
- 배열형
- 클래스형
- 인터페이스형
- 열거형
배열
동일한 자료형을 갖는 순서있는 원소들의 모임
생성될 때 크기가 결정되어 고정되고, 인덱스를 통해 접근
선언, 생성, 배정의 차이점
- 선언은 배열을 가리킬 배열 참조 변수에 대한 저장 공간만을 할당 받는 것
- 생성은 배열 원소를 저장할 수 있는 저장 공간을 힙에 할당 받는 것
- 배정은 할당받은 저장 공간을 배열 참조 변수가 가르키도록 하는 것
선언
String[] args;
- String 객체 참조를 원소로 갖는 배열
int[] intArr;
- int 자료를 원소로 갖는 배열
생성, 배정
intArr = new int[5];
- int 자료 5개 원소로 갖는 배열을 생성하고, intArr에 배정
args = new String[3];
- String 객체 참조 3개를 원소로 갖는 배열 생성, args에 배정
기본형 배열 선언
- byte[] anArrayOfBytes;
- short[] anArrayOfShorts;
- long[] anArrayOfLongs;
- float[] anArrayOfFloats;
- double[] anArrayOfDoubles;
- boolean[] anArrayOfBooleans;
- char[] anArrayOfChars;
- String[] anArrayOfStrings;
간단한 생성 및 초기화 구문
int[] anArray = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
배열의 배열
int[][] matrix = new int[3][4];
- 각 3개의 원소를 갖는 배열
int[][] matrix = new int[3][];
- 두 번째 차원은 나중에 결정할 수 있다. 이 경우 일차원 배열은 다른 크기의 배열을 원소로 가질 수 있다.
MultiDimArrayTest.java
class MultiDimArrayTest {
public static void main(String[] args){
String[][] names = {
{"Mr. ", "Mrs. ", "Ms. "},
{"Smith", "Jones"}};
System.out.println(names[0][0] + names[1][0]); // Mr. Smith
System.out.println(names[0][2] + names[1][1]); // Ms. Jones
}
}
Arrays 클래스를 이용한 배열 처리
기능
- 내용 출력, 복사, 정렬 기능 제공
- jdk1.2부터 java.util 패키지에 포함
주요 메소드
- toStirng(T[] a)
- toString(기본형[] a)
- copyOf(T[], int newLength)
- copyOfRange(T[], int from, int to)
- sort(T[] a)
ArraysTest.java
import java.util.Arrays;
public class ArraysTest {
public static void main(String[] args) {
String [] stringArray = {"in", "duk", "university", "computer", "software"};
String toStr = Arrays.toString(stringArray);
System.out.println(toStr); // [in, duk, university, computer, software]
String[] subArray = Arrays.copyOfRange(stringArray, 2, 4);
System.out.println(Arrays.toString(subArray)); // [university, computer]
System.out.println("****** Unsorted String Array *******"); // ****** Unsorted String Array *******
for (String str : stringArray) {
System.out.println(str);
}
/*in
duk
university
computer
software */
Arrays.sort(stringArray);
System.out.println("****** Sorted String Array *******"); // ****** Sorted String Array *******
for (String str : stringArray) {
System.out.println(str);
}
/*computer
duk
in
software
university */
}
}
클래스 형
String args;
- args는 String 객체를 가르키는 참조 변수
인터페이스 형
java.net 패키지의 SocketOptions.IP_MULTICAST_LOOP
- 객체를 가질 수 없음
- 선언된 멤버 필드는 상수임 (public static final)
- 선언된 메소드는 public이지만 static은 될 수 없음
유효 범위가 다른 변수의 초기화
지역변수
초기화하지 않으면 오류가 발생
인스턴스 변수
초기화하지 않는 경우 기본값으로 초기화 됨
클래스 변수
초기화하지 않는 경우 기본값으로 초기화 됨
ObjectCreationTest.java
public class ObjectCreationTest {
public static void main(String[] args) {
ObjectCreation oc1 = new ObjectCreation();
ObjectCreation oc2 = new ObjectCreation();
ObjectCreation oc3 = new ObjectCreation();
}
}
class ObjectCreation {
static int objCount; // 기본값으로 초기화를 수행한다.
public ObjectCreation() {
objCount++;
System.out.println(objCount + "번째 객체를 생성하였습니다" );
}
/*1번째 객체를 생성하였습니다
2번째 객체를 생성하였습니다
3번째 객체를 생성하였습니다 */
}
StaticVariableTest.java
public class StaticVariableTest {
public static void main(String[] args) {
UsingConstructor.sInt -= 1; // 생성자로 초기화되지 않고 사용
StaticInit.sInt -= 1;
System.out.println(UsingConstructor.sInt); // -1
System.out.println(StaticInit.sInt); // 9
}
}
class UsingConstructor {
static int sInt; // sInt는 클래스 변수, 초기화 하지 않는 경우 0으로 기본 초기화 됨
public UsingConstructor() {
sInt = 10;
}
}
class StaticInit {
static int sInt = 10;
public StaticInit() {
}
}
래퍼 클래스(wrapper class)
정의
- 기본 자료형을 효율적으로 다루기 위해 생성한 클래스
- 기본 자료형을 자료 추상화하여 객체로 다룰 수 있도록 함
- 유용한 메소드를 추가적으로 제공함
특징
- Setter 메소드가 없음
- 불변성 : 생성된 객체의 값을 변경할 수 없음
종류
- Byte, Short, Integer, Long
- Float, Double
- Character
- Boolean
기본 자료형과 래퍼 클래스 사용
JDK 1.5 이전
- Double pi = new Double(3.14);
- double pai = pi.doubleValue();
JDK 1.5 이후
- Double pi = 3.14; // 박싱(boxing)
- double pai = pi; // 언박싱(unboxing)
박싱과 언박싱
박싱(boxing) : 기본형의 데이터를 참조형을 변환하는 것
언박싱(unboxing) : 참조형의 데이터를 기본형으로 변환하는 것
AutoboxUnboxTest.java
package soft.java.ch04;
import java.util.HashMap;
import java.util.Map;
public class AutoboxUnboxTest {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("나이", 25);
int age = map.get("나이");
System.out.println("Unboxing - 현재 나이 : " + age); // Unboxing - 현재 나이 : 25
Integer newAge = age + 10;
System.out.println("AutoBoxing - 십년 후 나이 : " + newAge); // AutoBoxing - 십년 후 나이 : 35
}
}
형 변환(Type Conversion)
정의
- 올바른 연산을 하기 위해서는 피연산자들의 자료형은 일치해야 한다.
- 즉, 피연산자들의 자료형을 일치시키기 위해 수행하는 일련의 과정을 의미한다.
분류
- 기본형 변환(Primitive Conversion)
- 참조형 변환(Reference Conversion)
- 박싱/언박싱(Boxing/Unboxing)
형변환 - 기본형 형변환
▪ 누가 수행하는가?
명시적 형변환 : 프로그래머
int intType;
float floaType = 3.5f;
intType = (int) floatType;
정밀도(precision) 상실
- int => float => int, long => float => long, long => double => long
묵시적 형변환 : 컴파일러
- 정보가 상실되지 않는 경우에 발생
- 예) 기본형들 사이에서 광역화 형변환
자료형 크기 변화는?
광역화 형변환
- 기본형들 사이에서는 실행시간 예외를 발생하지 않음
협소화 형변환
- 명시적 형변환을 하지 않는 경우 컴파일 에러 발생
- byte => char
short => byte, char
char => byte, short
int => byte, short, char
long => byte, short, char, int
float => byte, short, char, int, long
double => byte, short, char, int, long, float
'2-1 > JAVA 프로그래밍' 카테고리의 다른 글
JAVA 프로그래밍 6주차 정리 (0) | 2023.04.11 |
---|---|
JAVA 프로그래밍 5주차 정리 (0) | 2023.04.04 |
JAVA 프로그래밍 4주차 정리 (0) | 2023.03.28 |
JAVA 프로그래밍 2주차 정리 (0) | 2023.03.14 |
JAVA 프로그래밍 1주차 정리 (0) | 2023.03.07 |