JAVA 기초

김주언·2022년 7월 12일

JAVA

목록 보기
1/10
post-thumbnail

자바 시작하기

  • 기계어 : 컴퓨터가 이해하고 실행할 수 있는 0과1로 이루어진 코드
  • 프로그래밍 언어 : 사람이 기계어를 이해하는 것은 매우 어렵기 때문에 언어와 기계어 사이 다리역할. C / C++, Python 등
  • 소스 파일 : 프로그래밍 언어로 작성된 파일
  • 컴파일 : 소스 파일을 기계어로 번역하는 것. 이 역할을 담당하는 소프트웨어를 컴파일러라고 한다.
  • JDK : Java Development Kit. 자바로 프로그램을 개발할 수 있는 실행 환경(JVM)과 개발도구(컴파일러)를 제공한다.
  • 환경 변수 : 운영체제가 실행하는데 필요한 정보를 제공해주는 변수

자바 프로그램을 개발하기 위해

  1. 확장자명이 .java인 텍스트파일 생성
  2. 자바 언어로 코드 생성
  3. javac 명령어로 컴파일
  4. 컴파일 성공 시 확장자명이 .class인 바이트 코드 파일 생성됨 (바이트 코드 파일은 bin 폴더 내부에 생성된다)
  5. 바이트 코드파일을 실행하기 위해 java 명령어 사용한다.

바이트 코드 파일과 자바 가상 기계

자바 프로그램은 완전한 기계어가 아닌 바이트 코드 파일 (.class)로 구성된다. 바이트 코드 파일은 완전한 기계어 아님 → 운영체제에서 바로 실행할 수 없고 JVM이라는 번역기 필요하다.

java 명령어를 실행하면 JVM은 바이트 코드 파일을 해당 운영체제에서 실행 가능한 기계어로 번역하여 실행

1. 자바 자료형

1.1 정수

기본 자료형 (primitive data type)의 종류

정수형문자형실수형논리형
1바이트byte--boolean
2바이트shortchar--
4바이트int-float-
8바이트long-double-

int로 십진수 10을 표현하면
00000000 00000000 00000000 00001010 로 표현하게 되면 가장 좌측의 비트 하나는 부호를 나타내는 부호 비트이다.

byte와 short

byte는 1바이트 단위의 자료형 동영상, 음악 파일, 실행 파일의 자료를 처리할 때 사용하고 short는 2바이트 단위의 자료형 C/C++ 언어와 호환 시 사용한다.

int

  • 자바에서 사용하는 정수에 대한 기본 자료 형
  • 4바이트 단위의 자료형
  • 프로그램에서 사용하는 모든 숫자(리터럴)은 int 로 저장됨
  • 32 비트를 초과하는 숫자는 long 자료형으로 처리

long

  • 8바이트 자료형
  • 숫자의 뒤에 알파벳 L 또는 l 을 써서 long 형임을 표시 함
  • 예) int num = 12345678900; // 오류
    long lnum = 12345678900; //오류
    long lnumber = 12345678900L; // ok

1.2 실수

부동 소수점 방식

실수는 정수보다 정밀하기 때문에 정수와 다른 방식으로 표현한다.

  • 지수부와 가수부로 표현 함
  • 컴퓨터에서는 밑수를 2로 사용
  • 정규화 : 가수가 밑수보다 작은 한 자리까지 가수로 표현 되는 것

float과 double

자바에서는 실수의 기본 타입은 dobule을 사용 함

부동 소수점 방식의 오류

지수와 가수로 나타내는 부동 소수점 방식에서는 지수부가 0을 표현할 수 없기 때문에 약간의 오차가 발생할 수 있다

   public class DoubleTest2 {

	public static void main(String[] args) {

		double dnum = 1;
		
		for(int i = 0; i<10000; i++) {
			dnum = dnum + 0.1;
		}
		System.out.println(dnum);
	}
}

위 코드를 출력하면 1001.000000000159가 출력된다.


1.3 문자

문자도 정수로 표현한다.

어떤 문자를 컴퓨터 내부에서 표현하기 위해 특정 정수 값을 정의 (A 는 65)

문자세트 : 각 문자를 얼마로 표현할 것인지 코드 값을 모아둔 것을 문자세트(charater set)라 함
(ex. ASKII, euc-kr, utf-8, utf-16)

자바는 문자를 나타내기 위해 전세계 표준인 UNICODE를 사용한다. utf-16 인코딩을 사용 (모든 문자를 2바이트로 표시)

character set: 문자를 숫자로 변환한 값의 세트

encoding: 문자가 숫자로 변환되는 것
decoding: 숫자에서 다시 문자로 변환되는 것

ASKII code: 알파벳과 숫자 특수 문자등을 1바이트에 표현하는데 사용하는 문자세트

UNICODE: 전 세계 표준으로 만든 문자 세트

UTF-8: 1바이트에서 4바이트까지 다양하게 문자를 표현할 수 있음

UTF-16: 2바이트로 문자를 표현

1.4 논리형과 자료형 없이 변수 사용하기

논리형

  • true(참), false(거짓) 두 가지만 나타냄
  • 1바이트 사용
  • 값이 존재하는지, 배열이 비었는지, 결과가 참인지 거짓인지 등을 표현

지역변수 자료형 없이 사용하기

  • Local variable type inference
  • 추론 가능한 변수에 대한 자료형을 선언하지 않음
  • 한번 선언하여 추론 된 변수는 다른 타입의 값을 대입 할 수 없음
  • 지역 변수만 사용 가능

public class LocalVariableType {

	public static void main(String[] args) {

		var i = 10;
		var j = 10.0;
		var str = "hello";
		
		System.out.println(i);
		System.out.println(j);
		System.out.println(str);
		
		str = "test";
		//str = 3; 
	}
}

1.5 상수와 리터럴, 형변환

상수

  • 상수는 변하지 않는 수
  • 원주률 3.14, 1년 12개월 등
  • final 예약어를 사용하여 선언
  • 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고 혹시 변하더라도 선언한 부분만 변경하면 되므로 여러부분을 수정할 필요가 없음

리터럴

  • 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻함
  • 리터럴은 상수 풀(constant pool)에 있음
  • 정수 리터럴은 int 로 실수 리터럴은 double 로 저장됨
    정수의 범위가 넘어가는 경우는 L,l을 float로 사용하려는 경우는 F,f 식별자를 써줘야 함

형변환

  • 서로 다른 자료형 간에 연산등의 수행을 위해 하나의 자료형으로 통일하는 것
  • 묵시적 형 변환(explicit type conversion, 자동 형 변환)과 명시적 형 변환(implicit type conversion, 강제 형 변환)이 있음
  • 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어 짐
  • 덜 정밀한 자료형에서 더 정밀한 자료형으로읜 형 변환은 자동으로 이루어 짐

1.6 참조 타입

  • 자바의 참조 타입
  • 메모리 영역의 세부 영역과 기능
  • 참조변수의 == , != 연산과 NullPointerException
  • String, 배열, 열거타입

자바의 타입은 크게 기본타입과 참조타입으로 분류된다. 참조타입이란 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스를 말한다.

기본 타입과 참조 타입

기본타입으로 선언된 변수와 참조 타입으로 선언된 변수의 차이점은 저장되는 값.

기본타입은 실제 값을 저장하지만 참조타입은 메모리의 번지를 변수 안에 저장.

메모리 사용 영역

JVM은 운영체제에서 할당받은 메모리영역을 (Runtime Data Area) 아래와 같이 세부영역으로 구분한다.

  • 메소드 영역
    JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역. 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드코드, 생성자코드 등을 분류해서 저장한다.
  • 힙 영역
    객체와 배열이 생성되는 영역. 여기에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 만일 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 가비지 콜렉터가 이를 제거한다.
  • JVM 스택 영역
    JVM 스택은 메소드를 호출할때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거한다. (push & pop)

프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다. 스택영역에 변수가 생성되는 시점은 초기화가 될 때, 즉 최초로 변수에 값이 저장될 때. 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

열거타입

데이터 중 몇 가지로 한정된 값만 가지는 경우가 있다. 예를 들어 요일에 대한 데이터는 월~일 7개의 값만 가지고 계절에 대한 데이터는 봄~겨울 4개의 값만 가진다. 이처럼 한정된 값만을 갖는 타입을 열거 타입이라 한다.

열거 타입은 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입

열거 타입 선언

열거 타입을 선언하기 위해서는 먼저 열거타입의 이름을 정하고 해당 이름으로 소스파일을(.java) 생성해야한다.

public enum Week {
	MON,
	TUE,
	WED,
	THUR,
	FRI,
	SAT,
	SUN
}
  • Week : 열거 타입 이름
  • MON ~ SUN : 열거 상수

위처럼 선언한 열거 타입을 사용하여 변수를 선언할 수 있다.

Week today;

today 변수에 저장할 수 있는 것은 Week에 선언된 7개의 열거 상수 중 하나

today = Week.FRI;

열거타입 변수 Week의 경우 MON~SUN까지의 열거상수는 총 7개의 Week 객체로 생성된다. (힙 영역에 올라감) 그리고 메소드 영역에 생성된 열거 상수가 해당 Week 객체를 각각 참조하게 된다.

열거 타입 변수 today는 스택 영역에 생성됨. today에 저장되는 값은 Week.SUN 열거 상수가 참조하는 객체의 번지이다.

따라서 아래의 코드는 출력값이 true가 된다.

Week week1 = Week.SAT;
Week week2 = Week.SAT;

System.out.println(week1 == week2);

2. 객체지향 프로그래밍

2.1 객체

  • 의사나 행위가 미치는 대상 ( 사전적 의미 )
  • 구체적, 추상적 데이터의 단위 ( 학생, 회원, 생산, 주문, 배송 )

객체 지향 프로그램을 구현하기 위해서 객체를 정의 하고, 각 객체별로 제공하는 기능들을 구현하고, 각 객체가 제공하는 기능들 간의 소통(메세지 전달)을 통하여 객체간의 협력을 구현한다.

2.2 클래스

클래스는 객체의 청사진이라고 생각하면 된다.
객체의 속성은 클래스의 맴버 변수로 선언한다.

학생 클래스

public class Student {

	int studentNumber;
	String studentName;
	int majorCode;
	String majorName;
	int grade;
}

주문 클래스

public class Order {

	int orderId;
	String buyerId;
	String sellerId;
	int productId;
	String orderDate;
}

2.3 함수와 메서드

함수 구현 예제

public class FunctionTest {
	
	public static int addNum(int num1, int num2) {
		int result;
		result = num1 + num2;
		return result;
	}
	
	public static void sayHello(String greeting) {
		System.out.println(greeting);
	}
	
	public static int calcSum() {
		
		int sum = 0;
		int i;
		
		for(i = 0; i<=100; i++) {
			sum += i;
		}
		
		return sum;
	}

	public static void main(String[] args) {
		
		int n1 = 10;
		int n2 = 20;
		
		int total = addNum(n1, n2);
		
		sayHello("안녕하세요");
		int num = calcSum();
		
		System.out.println(total);
		System.out.println(num);
	}
}

함수 호출과 스택 메모리

인스턴스 생성과 힙 메모리

인스턴스

  • 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
  • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨
    가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 됨
  • new 키워드를 사용하여 인스턴스 생성

힙 메모리

  • 생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
  • C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함 ( free() 난 delete 이용)
  • 자바에서 Gabage Collector 가 주기 적으로 사용하지 않늠 메모리를 수거
  • 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글