Dev/Java

[java] 기초

창문닦이 2019. 1. 21. 19:19

1. 자바를 컴파일하고 실행하는 방법 ?

javac.exe - 자바컴파일러, 자바소스코드를 바이트코드로 컴파일한다.

c:\j2sdk1.4.1\work>javac Hello.java

java.exe - 자바인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다.

c:\j2sdk1.4.1\work>java Hello

javap.exe - 역어셈블러, 컴파일된 클래스파일(.class)를 원래의 소스(.java)로 변환한다. c:\j2sdk1.4.1\work>javap Hello > Hello.java

 

자바프로그램의 실행과정

1. 프로그램의 실행에 필요한 클래스를 로드한다. 

2. 클래스파일을 검사한다. 

3. 지정된 클래스(Hello)에서 main(String args[])를 찾아서 호출한다.

JRE - 자바실행환경(Java Runtime Environment), 자바로 작성된 응용프로그램이 실행되기 위한 최소환경

2. 자바의 기본 자료형 및 크기 ?

변수 : 컴퓨터 언어에서 변수(variable)란, 값을 저장할 수 있는 메모리상의 공간

기본형(Primitive Type) - boolean, char, byte, short, int, long, float, double

참조형(Reference Type) - 8개의 기본형을 제외한 나머지 타입, 객체의 주소를 저장.

기본형의 개수는 모두 8개이고, 참조형은 프로그래머가 직접 만들어 추가할 수 있으므로 그 수 가 정해져 있지 않다.

참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 변수의 타입이 된다.

그러므로 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 것.

 

 

 1 byte

 2 byte

 4 byte

 8 byte

 논리형

 Boolean

 

 

 

 문자형

 

 Char

 

 

 정수형

 Byte

 Short

 Int

 Long

 실수형

 

 

 Float

 Double

 

Wrapper class : 8개의 기본 타입에 해당하는 데이터를 객체로 포장해주는 클래스

박싱: 기본타입의 데이터를 래퍼클래스의 인스턴스로 변환하는 과정

언박싱 : 래퍼클래스의 인스턴스에 저장된 값을 다시 기본타입의 데이터로 꺼내는 과정

//auto-Boxing : stack -> heap  stack 영역의 데이터가 heap 영역으로 넘어가는 것

//auto-UnBoxing :heap -> stack

 

* 메모리 구조.

모든 자바 프로그램은 JVM을 통해서 실행된다. JVM은 운영체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다. 할당받은 메모리를 JVM은 용도에 따라 메소드영역, 힙영역, 스택영역으로 구분하여 관리한다.

 

* 메소드영역 : 자바 프로그램에서 사용되는 클래스에 대한 정보와 static 변수가 저장되는 영역

 

* 힙영역 : 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역. new 키워드를 사용해서 인스턴스가 생성되면 해당 정보를 힙영역에 저장

 

* 스택영역 : 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역. 메소드가 호출되면 관계되는 지역변수와 매개변수를 스택영역에 저장. 이렇게 스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임이라고 함. 스택은 후입선출 방식에 동작되므로 가장 늦게 저장된 데이터가 가장 먼저 인출.

3. 삼항연산자의 형식 및 간단한 예제 만들기

String str = (num1 % 2 == 0) ? “짝수” : “홀수” ;

String str = num1>0 ? “양수” : (num1<0 ? “홀수” : “0” );

String str = num1%4==0 && num1%100!=0 || num1%400 ? “윤년” : “평년”;

4. 제어문의 종류및 형식을 설명하고 제어문당 간단한 예제 하나씩 만들기

제어문의 종류 : if, switch, for, while, do~while

반복문(for, while, do~while)

For : 시작과 끝 값이 정해져 있을 때

//for(초기값;최대값_조건;증가값)

for (int i=1;i<=9;i++) {

System.out.printf("%d * %d = %d\n",dan, i, dan*i);

}

While: 끝 값이 정해져 있지 않을 때

//while문은 일반적으로 초기값을 0으로 설정함.

//배열을 사용할 경우 첫 번째 배열이 [0]인 걸 활용하기 위해

//while(조건) 몇번 돌려야 할지 모를 때 대부분 사용.

int j=0; //나중에 배열을 사용할 때 편하게 하기 위해서 0으로 시작. 무조건은 아님.

while (j<9) {

j++;

System.out.printf("%d * %d = %d\n",dan, j, dan*j);

}

Do~while: 1번은 무조건 실행시키고 확인해야 할 때

//do~while(조건문); 세미콜론 잊으면 안됨. 1번은 무조건 바로 실행이 된다.

int k=0;

do {

k++;

System.out.printf("%d * %d = %d\n",dan, k, dan*k);

 

} while (k<9);

 

 

//if문

int i, j, k, tot;

int max, min;

max = min = tot = 0;

 

//입력

Scanner sc = new Scanner(System.in);

System.out.print("두 수를 입력하세요.");

i = sc.nextInt();//30

j = sc.nextInt();//20

 

//연산

if (i > j) {

max = i;

min = j;

}

 

if (j > i) {

max = j;

min = i;

}

 

for (k = min; k <= max; k++) {

tot += k;

}

//출력

System.out.printf("%d에서 %d까지의 합 : %d", min, max, tot);

5. 배열의 개요 및 배열의 생성, 초기값을 부여하는 방법 ?

배열의 생성

int num[]= new int[5];

int[] num = new int[5];

6. 생성자, 디폴트생성자 개요

1. 메모리를 할당 받을 때 사용. 2. 변수 초기화 목적.

클래스의 이름과 동일한 이름을 가진 메소드. 리턴값이 없기 때문에 property가 없다. 생성자냐 메소드냐 둘중에 하나.

property가 있다면 무조건 메소드에 해당한다.

오버로딩이 가능함. (오버로딩 : 메소드중복정의. 하나의 클래스 안에서 이름은 같지만 데이터 자료형,매개변수 갯수 상이함.)

한 번만 호출 가능 

7. 메소드 오버로딩(Overloading) 이란? 메소드 중복정의

같은 클래스 안에서 메소드의 이름은 동일하지만 매개변수의 개수나 자료형은 달라야 한다. 별개의 다른 메소드로 인식한다.

만약, 메소드의 이름, 매개변수의 자료형과 개수가 동일하다면 같은 메소드로 인식한다.

왜 사용하는가? 같은 역할을 하는 메소드를 통일시키기 위해서 사용한다.

**오버로딩된 생성자를 통해 객체 생성시 초기화 바로 진행. spring에서 의존성 주입이라고 함.

**Call By Value : 동일 변수 값을 가진다. stack영역의 데이터가 Heap영역으로 데이터 자체가 넘어간다. 값의 복사 개념.

**Call By Reference : Heap영역에 있는 데이터를 복사할 때 데이터 자체가 복사되는 게 아니라 주소가 복사된다.

  Static과 같은 역할을 함. 동일 주소를 가진다. 전달된 주소가 가르키는 변수이 조작을 가능하게 한다.

주소를 서로 나누어가짐으로써 이미 만들어진 것을 가져다 사용.

** Singleton : 객체를 계속해서 생성하는 것이 아니라 하나만 생성하고 공유해 사용하는 방법이다.

- Static, Call by reference 이 구조를 갖는 객체를 싱글톤 객체라고 함.

8. private, protected, public 이란? 접근제어자 개념

접근제어자 : 클래스나 클래스의 멤버에 대한 접근을 제한하는 역할. Public > protected > default > private

Public : 접근 제한이 없음

Protected : 동일한 패키지내 존재하거나 파생클래스에서만 접근 가능

Default : 아무런 접근제한자를 명시하지 않으면 default값이 되며 동일한 패키지 내에서만 접근이 가능

Private : 자기 자신의 클래스 내에서만 접근이 가능

9. import문의 형식

import문을 작성해야 외부클래스를 사용가능. 패키지 선언 시 상위, 하위패키지가 구분되면 ‘.’을 찍어서 표현

C언어의 include와 유사하다. 즉 라이브러리에 포함된 기능들을 사용할 수 있게 해준다.

10. this, super ?

기본 생성자 안에 super( ) 존재. super( )의 역할은 부모-자식클래스간의 관계를 유지시켜주는 것

11. final, static

Final을 붙일 수 있는 3가지 경우

멤버변수에 final을 붙이면 단 한번만 초기화 가능

메소드에 final을 붙이면 Override(재정의) 불가

클래스에 final을 붙이면 상속 불가

12. 상속이란 ? 

부모클래스의 특성을 자식클래스에게 주는 것

부모꺼는 내거다

private 로 선언한 것은 상속이 불가능

protected 로 선언한 것은 상속이 가능. 같은 패키지 안에서라면 사용 가능

내꺼는 내거다. 부모가 가져다가 쓸 순 없음. 이순신의 특징은 이순신만 사용 가능!

부모도 가지고 있고 나도 가지고 있으면 내꺼 쓴다.

동시에 다중상속이 안되기 때문에 하나만 쓸 수 있음.(단일 상속) : class SubClass extends SuperClass

13. Object 클래스 ?

자바에서 가장 큰 자료형. 최상위 클래스. 무엇이든 담을 수 있는 변수. 모든 클래스는 Object를 상속받는다.

14. 메소드 오버라이딩 ? 메소드 재정의

override(오버라이드, 재정의, 다형성) : 저장공간이 다르기 때문에 메소드 이름이 동일해도 가능함.

상속관계에서 부모의 메소드와 똑같이 만들고...(메소드명, 매개변수 등) 내용만 다르게 만듦

하는 역할은 유사. 자식의 마음대로 내용을 변형. 프로그래머의 의도가 반영

****

자식이 부모의 메소드를 override했다면 나에게 맞춰 메소드 내용을 바꾸고 싶기 때문에 진행. 나의 의도가 들어감

> 책에서는 보안 영역이 강하기 때문에 호출을 어떻게 하더라도 자신의 메소드 결과를 반환한다 표현

오버라이딩 메소드를 부모클래스의 메소드로 꼭 사용하고 싶다면

자식메소드에 super.메소드();로 호출해서 하는 방법 있음. 단, main문에서는 불가

부모클래스로 형변환을 했어도 메소드는 인스턴스 변수와는 다르게 자신의 메소드를 호출한다

메소드는 heap영역이 아니라 메소드 영역에 있기 때문에 접근 금지.(메소드 영역 보안 높음)

메소드는 upcast를 해도 무조건 자신의 것을 사용한다.

 

@Override 어노테이션(Annotation) : 메소드명이나 매개변수 갯수,자료형들이 달라지면 알려줌

마우스우클릭 - Source > Override > 부모클래스중에 어느 메소드를 재정의할지 어노테이션 기능 사용 가능

부모클래스가 무엇인지도 쉽게 볼 수 있음

15. String에 대하여 간단히 설명하고 중요 메소드 10개만 설명 또는 사용법?

-String은 문자열을 저장하는 클래스이다. 자료형이 아니다.

-다만, String을 자료형처럼 사용하는 이유는 저장하는 양은 방대하고 사용빈도가 높기 때문이다.

-Stack영역에 저장할 수 없고, heap영역에 저장해야 하므로 class여야 함.

그런데 사용빈도가 높다 보니 new를 사용하여 매번 객체 생성시 번거로워 자료형처럼 사용하게 됨.

-Stiring은 불변의 법칙을 가지고 있다.

문자열의 내용이 변경되더라도 모두 다 저장되어 쓰레기값으로 메모리 낭비가 생길 수 있다.

-String은 equals()로 비교한다 .

Object.equals( ) 두 객체의 주소를 비교 / String.equals( ) 두 객체의 문자열 내용을 비교

-사용하는 다양한 메소드

split() : 매개변수 기준으로 나눠라

equalsIgnoreCase:영대소문자를 구분하지 않고 문자열을 비교

indexOf():매개변수가 나오는 인덱스값을 반환

lastIndexOf :매개변수가 나오는 마지막 인덱스값을 반환

replaceAll(“a”,”b”): 문자열 a를 모두 b로교체해라

startsWith(): 해당문자열이 매개변수로 시작하는가 true/false로 반환

length() : 문자열의 길이 반환

trim() : 공백제거  

compareTo() :사전식 배열 정렬. ASCII값의 차(가나다순으로)

substring(시작인덱스,마지막인덱스-1) : Returns a string that is a substring of this string

16. StringBuffer에 대하여 간단히 설명

StringBuffer - 동기화 지원O(builder보다 느림)
StringBuilder - 동기화 지원X(지원하지 않아 빠름)
위에 두 클래스는 import하지 않아도 사용 가능! -> 둘 다 lang패키지에 있다.
둘은 하는 역할이 다르므로 동기화 지원여부에 따라서 선택하여 사용하면 된다.

17. Calendar 클래스에 대한 간단한 설명(객체 생성 방법, 주요 메소드 등)

Calendar클래스는 현재 시점의 날짜와 시간을 이용하는 static 클래스이다.

언제 호출하더라도 같은 값을 반환하므로 굳이 여러 개의 객체를 만들어 메모리를 낭비할 필요가 없다

18. 추상 클래스(abstract class)

메모리의 낭비 없이 클래스를 미리 설계. 메소드를 재정의해서 사용한다 (override).

추상클래스를 상속받을 경우 메소드명을 가져다가 사용하면 됨.

강제성을 띄지만 메소드명 만드는 데 노력이 들지 않음.

메소드명이 동일하여 통일성을 띔. 추상클래스도 부모클래스의 역할을 함. Interface와 동일.

추상클래스의 메소드 중 unimplement method가 존재 시 오류

추상클래스 안에는 무조건 추상메소드가 1개 이상 존재해야 함.

 

일반메소드만 존재한다면 에러는 나지 않지만 굳이 추상클래스로 만들 필요가 없음

'Dev > Java' 카테고리의 다른 글

[java] 배열, 달력만들기  (0) 2019.01.21
[java] for문, switch문  (0) 2019.01.21
[java] 반복문  (0) 2019.01.21
[java] 간단한 계산기 만들기  (0) 2019.01.21
[java] 자바 공부 시작  (0) 2019.01.21