Notice
Recent Posts
Recent Comments
Link
관리 메뉴

브래의 슬기로운 코딩 생활

JAVA 프로그래밍 3주차 정리 본문

2-1/JAVA 프로그래밍

JAVA 프로그래밍 3주차 정리

김브래 2023. 3. 21. 22:16

필기

깃 많이 쓴다

 



인텔리제이 한글이 나오지 않을 때
쉬프트 두번 - 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 = 애플리케이션 프로그래밍 인터페이스 (함수 설명서)

 

Overview (Java SE 17 & JDK 17)

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

 

추상 메소드: 메소드 선언으로만 구성된 메소드, 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