본문 바로가기

Java/Java Language

(37)
[Java] 메서드의 종류와 호출 과정 및 디스패치 Instance Method 호출 과정인스턴스 메서드의 메서드 호출 과정을 자세히 짚어보자면 다음과 같다.인스턴스의 실제 클래스 타입에 찾는 메서드가 정의되어 있으면 그 메서드를 호출한다.만약 인스턴스가 속한 클래스에 해당 메서드가 없으면, 상위 클래스로 올라가면서 메서드를 찾는다.JVM은 상속 계층을 따라 부모 클래스로 올라가며 메서드를 찾을 때까지 반복적으로 수행한다.그러므로 상속 계층이 깊어질수록, 메서드를 찾기 위해 부모 클래스, 조부모 클래스 등 상위 클래스까지 검색하는 작업이 추가되므로 검색 오버헤드가 발생할 수 있다. 게다가, java는 단일 상속을 사용하지만, 인터페이스 구현으로 인하여 인터페이스 다중 상속으로 메서드 검색 과정이 복잡해질 수 있다. 그리하여 JVM은 다중 상속을 지원하는 ..
[Java] 선언에 따른 변수의 종류 JVM의 메모리 공간과 변수Java 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다. JVM의 메모리 공간(Runtime Data Area)은 크게는 Method Area, Stack, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 되게 된다. 변수는 선언 위치에 따라서 멤버변수(Member Vaiable)와 지역변수(Local Variable)로 구분된다. 멤버 변수에는 클래스 변수(Class Variable)와 인스턴스 변수(Instance Variable)가 있다. 멤버 변수에 static을 붙이면 클래스 변수이고 않붙이면 인스턴스 변수이다. 지역변수는 메서드 내에 선언된 변수로..
[Java] 객체 지향 개념과 객체화 (절차 지향과의 비교) 객체 지향 언어의 탄생과 배경이전에는 전쟁과 과학 같은 특정 분야의 개발을 주로 하였었다. 이후 대중에게 컴퓨터가 보급되고 웹이 생겨남에 따라서, 프로그램 규모가 점점 커지고 요구사항의 빠른 변경이 생겨났다. 기존의 절차 지향 언어(Procedure-Oriented -Language)은 순차적인 함수의 흐름대로 코드를 작성한다. 그리하여 실행 흐름에 따라 동작하는 함수를 다른 곳에서 쓰기가 어렵고, 기능 수정을 위해 함수 하나를 변경하면 연관된 함수도 연쇄적으로 변경이 필요하였다. 그리하여 모듈화가 쉬운 형태로 만들어 코드 재사용성을 늘리고, 코드의 변경과 관리가 쉬운 형태로 개발하고자 하였다. 이로써 나온것이 객체 지향 언어(Object-Oriented-Language)이다. 그리하여 '특정 역할을 ..
[Java] Java의 플랫폼 독립성 Java의 철학Java의 철학은 플랫폼(CPU & OS)의 독립성에 대한 자유를 부여하고자 하였다. 모든 플랫폼마다 맞게 코드를 구현하는 것은 같은 일을 여러번 하는 것이고 개발스럽지 못하였다.Java 프로그램과 CPU와 OS의 호환Java 언어로 작성한 코드는 어떤 플랫폼(CPU와 OS)과 상관없이 돌아가고자 만들기 위해선 생각이 필요하다. 간단하게 생각하면, Java 프로그램과 CPU, OS 사이에 각각 변역가 역할을 하는 레이어가 필요하다. 그 역할을 하는 것이 JVM(Javar Virtual Machine)이다. Java로 작성된 소스코드는 바이트 코드로 변환되고, 이후 JVM이 각 플랫폼마다 호환되게 실행되어야한다.  그렇다면 Java 프로그램이 CPU와 OS의 호환을 위해서는 JVM의 어떤 역..
[Java] 배열에 대한 이해 (저장과 접근 방식, 복사 등) 배열(Array)의 탄생과 배경같은 타입의 변수를 여러개 선언할때 일일히 선언하는 것이 불편하여 만든 데이터 구조이다. 배열은 같은 타입의 여러 변수들을 하나로 묶는 것이며, 연속적으로 저장한다.기존의 여러 변수를 통해 접근한다면, 각 변수의 이름을 알아야 접근이 가능하고 순차적으로 접근이 힘들다. 배열 하나로 많은 양의 데이터를 손쉽게 다루며, 특히나 연속적인 접근을 손쉽게 할 수 있다.// 여러 변수로 선언int a, b, c, d; a = 1; b = 2; c = 3; d = 4;// 배열 선언과 생성int[] arr = new arr[4];arr[0] = 1;arr[1] = 2;arr[2] = 3;arr[3] = 4;for (int i = 0; i 배열 선언과 생성아래는 첫 번째줄의 코드는..
[Java] 정수 고정값의 컴파일 최적화 정수(문자도 정수)의 상수(constant)와 리터럴(literal)은 상수 풀(constant pool)에 저장 되지 않고, 명령어의 수행할 연산인 opcode에 포함될수있다. 자바 컴파일러(javac)가 정수의 상수나 리터럴의 크기와 사용 빈도수를 고려하여, 값의 크기가 작고 사용 빈도수가 낮은 바이트 코드에서 명령어의 opcode에 직접 정의된다. 이로써 컴파일러의 최적화에 의하여 메모리에 접근하여 값을 가져오지 않아 보다 빠른 연산 처리를 수행할 수 있다. 다음은 어떻게 컴파일러가 최적화 했는지 확인해보기위해서 소스코드를 작성하고, 바이트 코드로 컴파일하여 확인해볼려고 한다.public class ByteCode { public static void main(String[] args) {..
[Java] if문과 switch문의 비교 (Jump Table) if문에서는 어떠한 조건이 true을 만족할때까지 순차적으로 조건식을 확인해야한다. 그러므로 경우의 수가 많아질수록 조건식(if-else)이 많아져서, 조건식에 대한 처리시간이 많이 걸린다.if (score >= 90) { System.out.println("A");} else if (score >= 80) { System.out.println("B");} else if (score >= 70) { System.out.println("C");} else if (score >= 60) { System.out.println("D");} else { System.out.println("F");} switch문에서는 하나의 조건식으로 많은 경우의 수를 처리할 수 있다. if문 보다 간..
[Java] 연산자 이해와 활용 연산자와 피연산자연산자(operator)는 연산(operation)을 수행하는 기호를 말한다.연산할 식에서는 연산자(operator)와 피연산자(operand)가 존재한다. 연산자는 다양한 연산자(산술, 비교, 논리, 대입, 증감, 비트 연산자)가 있고, 연산자는 연산할 대상인 피연산자(변수, 상수, 리터럴, 수식)가 필요하다. 아래의 식 x + y는 왼쪽의 + 연산자가 변수 x 와 상수 y 에 대한 결과 값 12를 반환한다. 이렇게 연산자는 피연산자로 연산을 수행하면 항상 하나의 결과 값을 반환한다. 그리고 반환된 결과 값을 대입 연산자(=)을 통해 result 변수에 저장한다.int x = 5;final int y = 7;int result = x + y; // +는 operator, x와 y는 op..