Dipa's document :: 'SH.Language/Java' 카테고리의 글 목록 (2 Page)

'SH.Language/Java'에 해당되는 글 13건

  1. 2017.12.04 [JAVA] Object클래스 - equals()
  2. 2017.11.13 [JAVA] JVM 의 메모리 구조
  3. 2017.11.12 [JAVA] Eclipse + jdk 설치 방법 (Path 설정 포함)

블로그에 빨리올려야지 했는데..벌써 한달이 가까운시간을 안하고 이제서야 올린다,,,ㅡㅡ 반성중(_ _)

이번에는 Object클레스에 대해서 공부해보고자 한다.

Object클래스는 Java.lang패키지에 있는 클래스로 Java.lang패키지는 자바 프로그램의 기본적인 클래스를 담고있는 패키지 이다. 그중에서도 Object클래스 자바 클래스의 최상이 클래스 이기떄문에 중요한 클래스라고 생각을 한다.

따라서, 클래스를 선언을 하고 extends를 통해서 다른 클래스를 상속을 받지 않으면, 암시적으로 java.lang패키지의 Object클래스를 상속을 받게 된다. 

자바의 모든 클래스는 Object클래스의 자식클래스이자 자손 클래스이다. Object클래스는 메소드들로만 구성이 되어 있는데 이 메소드들은 모든 클래스가 Object클래스를 상속을 받고 있으므로 모든 클래스에 사용이 가능하다.

Object 클래스의 메소드에는 equals(), hashCode(), toString() 등등이 있다.


* equals()

 결론부터 예기를 하면 Object 클래스의 equals()는 '==' 연산자와 동일한 기능을 한다. 같은 객체일 경우에는 true를 리턴을 하고, 객체가 다를경우에는 false를 리턴을 한다. 그렇다면 여기서 의문을 가지는게,,, 왜 String의 문자 비교를 할떄는 equals()를 쓰는지가 의문일 것이다.

그것은 String클래스가 Object클래스의 equals()메소드를 Override(재정의)를 하였기 떄문이다. String클래스의 equals()는 Override를 통해서 논리적 동등 비교를 하는 것이다.(논리적 동등 비교란? 객체가 같은지 다른지를 비교를 하는 것이 아닌 객체가 저장하고 있는 데이터를 비교를 하는 것)

public class ObjectEqualsMethod {

	public static void main(String[] args) {
		Object object01 = new Object();
		Object object02 = new Object();

		System.out.println(object01 == object02);
		
		System.out.println(object01.equals(object02));
	}

}

위에 코드를 보면 Object의 equals()메소드는 '=='연산자와 같다는 것을 알수가 있다. 

그렇다면 String클래스를 한번 살펴 보자.

   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

위의 코드는 Object클래스의 equals()메소드를 Override를 한 것이다. 처음 조건문에서는 객체를 비교를 하는 조건문이고 두번째 조건문에서는 String클래스가 맞으면 객체 안의 데이터. 즉, 문자를 비교를 하는 소스 코드이다.  첫번쨰 조건문이 왜 있는것일까? 단순희 문자만 비교를 하면 두번째 조건문마 있므면 되지 않나? 라는 의구심을 품는 개발자도 있을것이다. 

이 부분에 대해서는 String클래스 부분에서 다시한번 포스팅을 할 것이다. 결론부터 얘기를 하면 이 두소스의 차이이다. 

public class internMethod {

	public static void main(String[] args) {
		String input01 = "홍길동";
		String input02 = new String("홍길동");
		
		System.out.println(input01.equals(input02));

	}

}


Posted by SH후니
,

자바 프로그램을 개발하고(*.java) 개발한 자바소스 파일을 컴파일(javac.exe)을 하여 컴파일이 성공을 하면 바이트 코드(*.class)파일이 생성이 된다. 

응용 프로그램을 실행을 시키기 위해서, JVM 구동 명령어(java.exe)를 통해서 JVM을 구동 시키면 JVM은 운영체제로 부터 필요한 메모리를 할당을 받는데 이를 메모리 영역(Runtime Data Area)이라고 한다.

메모리 영역에는 3가지의 주요영역 (메소드 영역 - method area 또는 Class area 또는 Static area, 힙 영역 - heap area. 스택영역 - call stack 또는 execution stack)이 있다.

* 메소드 영역 : 클래스파일의 바이트 코드가 로드 되는 곳이다.

 프로그램 실행 중 어떤 클래스가 사용이 되면, JVM은 해당 클래스들을 클래스 로더로 읽어서 클래스별로 런타일 상수풀(runtime constant pool), 필드(field), 데이터, 메소드(method) 데이터, 메소드 코드 생성자 코드 등을 분류해서 저장하고,(왜냐? 우리가 집을 정리할떄도 어떤건 어디에두고 그러지 않나? 그거랑 똑같다고 생각하면 된다) 

이 영역은 JVM이 사작할 때 생성되고 모든 스레드가 공유 하는 영역이다.

*cf : 열거상수(enum 클래스의 상수)도 메소드 영역에 저장이 되고, 메소드 영역에 생성된 열거 상수가 해당 enum의 객체를 참조하게 된다.

* 힙 영역 : 인스턴스(객체) 가 생성되는 공간으로, 프로그램 실행중 생성되는 인스턴스는 모두 이 곳에 생성이 된다. 스택 영역의 변수나 다른 객체의 필드에서 참조를하며, 참조하는 변수나 필드가 없는 객체는 의미없는 객체가 되기 떄문에 JVM은 Garbage Collector에 의해서 자동으로 자동으로 힙 영역의 객체를 제거 한다.

* 스택 영역 : 한마디로 말하면 지역변수와 매개변수가 저장이 된다고 생각을 하면된다.

각 스레드 마다 하나씩 존재하며 스레드가 시작될떄 할당이 되고, java에서 추가적으로 스레드를 생성하지 않았다면 main 스래드만 존재하므로 스택도 하나이다. 메소드의 작업에 필요한 메모리 공간(Frame)을 제공을 하고, 메소드가 호출이 되면, 호출스택에 호출된 메소드를 위한 메모리가 할당되며, 이 메모리는 메소드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용이 되고. 메소드의 작업을 마치면 할당되었던 메모리 공간은 반환된다.

스택영역의 메모리 사용에 대해서 소스로 알아보자.

 public class StackMemory {

	public static void main(String[] args) {
		System.out.println("main(String[] args) 메소드 실행 시작 - stack 쌓임(push)");
		int sum = 0;
		int v1 = 10;
		int v2 = 20;
		System.out.println("main(String[] args) 메소드 영역 지역 변수 할당 및 초기화 (v1 = 10, v2 = 20, sum = 0)");
		sum = firstMethod(v1,v2);
		System.out.println("main(String[] args) 메소드 실행 종료 - memory 반환(pop)");
	}
	static int firstMethod(int a, int b){
		System.out.println("firstMethod() 메소드 실행 - stack 쌓임(push)");
		System.out.println("firstMethod() 메소드 영역 지역 변수 할당 및 초기화 (a = 10, b = 20)");
		secondMethod();
		System.out.println("firstMethod() 메소드 실행 종료 - memory 반환(pop)");
		return a + b;
	}
	static void secondMethod(){
		System.out.println("secondMethod() 메소드 실행 - stack 쌓임(push)");
		System.out.println("secondMethod() 메소드 실행 종료 - memory 반환(pop)");
	}

 }

stack 구조는 쌓는 방식으로써 순차적으로 실행을 할떄 main()프레임 영역이 쌓이고, 변수 선언 및 초기화를 하였을시에 main()영역 안에서 초기화가 이루어 진다. 

그러다가 firstMethod()가 실행이 되면 main()프레임의 작업을 잠시 맘추고 secondMethod()를 호출을 하여 stack에 main() 프레임 위에 쌓이게된다. 작업이 완료가 되면 메모리를 반환을 하고(pop)모든 호출을 통한 처리가 끝나게 된다.

Posted by SH후니
,



자바 프로그램을 개발하기 위해서는 Java SE(Standard Edition)의 구현체인 'JDK'를 설치를 하여야 합니다.

Java SE는 JDK(Java Development Kit)와 JRE(Java Runtime Environment) 두가지 버전이 있는데 둘의 차이점을 보면 간단히 이렇습니다.

JDK = JVM(JAVA Virtural Mashine) + 라이브러리 API + 컴파일러 등등

JRE = JVM(JAVA Virtural Mashine) + 라이브러리 API -> 자바 프로그램을 개발목적 X, 개발된 프로그램 실행 O


1. JAVA 다운 + 설치 방법

먼저 Oracle 사이트에 접속을하여 Jdk를 다운을 받아야 한다.

Oracle 홈페이지가 예전에 비해 구조가 조금 달라셔서 jdk를 다운로드 하려고 고생하시는 분들이 많은것 같아서 해당 URL을 제공 하겠다. http://www.oracle.com/technetwork/java/javase/downloads/index.html


아래 그림에서는 JDK 9가 있지만, 스크롤 내리면 JDK 8버전이 있습니다. 이번년도에 JDK 9가 출시가 되었지만..저는 JDK 8버전을 사용하도록 하겠습니다. JDK 다운 버튼을 누르시고

JDK를 설치를 하기위해서는 반드시 Accept License Agreement를 체크를 해주여야 하며, 자신의 운영체제에 맞게 클릭을 해주시면 됩니다.

JDK를 설치를 하면 설치 안내창이 뜨면서 설치를 합니다. 해당부분은 jdk의 설치 경로가 되겠고, next를 합니다. 설치 경로를 변경하고 싶으시면 change를 눌러서 변경을 하시기 바랍니다.

그리고 설치를 완료를 하였으면, 설치가 제대로 되었는지 확인을 해주시면 됩니다. CMD창을 열어서 

명령어를 java -version을 입력을 하고 enter를 치시면 아래와 같은 화면이 나오고 정상적으로 설치가 된것을 알 수 있습니다.


2. Path설정 하기

보통 많은 개발자 분들이 Java를 설치를 하고, Path를 설정을 하는데 Path를 왜 설정을 하는지 이유를 모르고 설정을 하시는 분들이 많은 거 같아서 간단히 말합니다.(저도 몰라서 찾아봣어요..ㅎㅎ)

JDK 내부의 bin 디렉토리에는 컴파일러인 javac.exe와 JVM 구동명령어인 java.exe가 포함이 되어 있는데 이 명령어들은 자바 프로그램 개발 시 아주 빈번히 사용이 됩니다. 이 명령어들을 다른 디렉토리에서도 쉽게 실행할 수 있도록 하기 위해 Path 환경 변수에 bin 위치를 등록할 필요가 있어서 하는 것입니다. 



제어판에서 고급 시스템 설정을 들어가주세요.

그리고 [고급]탭에서 환경 변수버튼을 클릭


[환경변수]에서 [시스템 변수]에 새로 만들기를 한다음 

변수이름 :  JAVA_HOME

변수 값 : JDK설치 경로 (bin전까지) 넣어주시면됩니다.


마지막으로 시스템 변수의 Path를 편집 버튼을 누르시고

제일 뒷부분에 ";%JAVA_HOME%\bin;" (큰따옴표는 아닙니다^^)를 넣어주세요


이러면 끝입니다. 이제 마지막으로 잘 설정되어 있는지 확인 하기위해 cmd 창에 명령어로 javac를 입력을 하여서 아래와 같이 나오면 설정이 다 된것입니다.



3. 이클립스 설치

URL : https://www.eclipse.org/downloads/

이클립스는 자바 언어로 개발된 툴이기 떄문에 이클립스를 실행하려면 JVM이 필요하다. 이미 JDK를 설치를 하였고 설정까지 하였으니, 이클립스를 다운받아서 압축풀고 쓰면 된다.

순수한 자바를 학습하기 위해서는 Eclipse IDE for Java Developer를 받으면 되지만, 웹 어플리케이션 등의 엔터프라지으(네트워크) 환경에서 실행되는 자바 애플리케이션을 개발하기 위해서는 Eclopse IDE for Java EE Developers를 다운을 받는게 좋을꺼 같습니다.


이클립스 + jdk 설치 방법을 마치도록 하겠습니다~ 감사합니다^^



'SH.Language > Java' 카테고리의 다른 글

[JAVA] Object클레스 - clone()  (0) 2017.12.14
[JAVA] Object클레스 - toString()  (0) 2017.12.11
[JAVA] Object클레스 - hashCode()  (0) 2017.12.06
[JAVA] Object클래스 - equals()  (0) 2017.12.04
[JAVA] JVM 의 메모리 구조  (0) 2017.11.13
Posted by SH후니
,