반응형
반응형

📝Java의 특징과 역사

Java의 특징에 대해서 알아봅시다. 프로그래밍언어로서 언어중에 탑3안에 들정도로 핫하죠

 

썬마이크로시스템즈사에서 한 번 쓰고 어느곳에도 실행 할 수 있게 하기 위해서 만들었고 웹과 인터넷의 출현으로 자바의 초점은 인터넷으로 옮겨지게 되었습니다.

썬마이크로시스템즈는 오라클과 인수합병 되었고 오라클로 넘어가게 되었습니다.

 

💗 장점

  1. C++과 같은 객체지향 언어 여러 방면 사용가능하다
  2. 이식성이 높다 (리눅스 , 유닉스 바로 호환가능) [플랫폼 독립적]
  3. 메모리를 자동으로 관리한다. (가비지컬렉터)
  4. 멀티스레드를 쉽게 구현 가능하다
  5. 동적로딩을 지원한다. 유지보수가 빠르고 쉽게 진행 할 수 있다 → 실행시 모든 객체 생성이 아니라 필요한 시점에서 로딩 해 객체 생성한다.
  6. 오픈소스 라이브러리가 풍부해 쉽게 개발한다.
  7. 자바는 바이트코드(.class)로 저장하기 때문에 그걸 실행하기 위해 JVM이 필요합니다 자바의 목표가 여러 환경에서 실행 가능하게 하기 위해 그렇게 저장합니다 즉 플랫폼 환경에 맞는 가상머신이 있다면 여러가지 환경에서 사용 가능합니다.

 

⚠️ 단점

  1. 자바는 실행을 위해 가상머신을 거쳐 다른 언어에 비해 실행속도가 느리다
  2. 예외처리는 잘 되어 있지만 일일이 처리해 줘야하는 불편한 점이 있다.
  3. 다른 언어에 비해 코드 길이가 긴 편이다

 

📝자바 라이프사이클

  1. 소스코드 작성
  2. 컴파일 →  바이트 코드로 변환
  3. 클래스 로딩 클래스 로더가 .class 파일을 JVM에 올려 놓는다
  4. 바이트코드 검증바이트 코드 로딩 후 JVM 내부에서 유효성 검사를 해서 유효하지 않으면 실행하지 않는다
  5. Just-In-Time (JIT) 자바 바이트 코드를 실행하는데 일반적으로 인터프리터 방식을 사용하는데 이럴 경우 한줄 씩 읽으면서 실행하기 때문에 실행 속도가 느리다. 이를 해결하기 위해 JIT 컴파일러를 도입 후 속도에 대한 이슈를 해결했다 인터프리터 대신 바이트코드를 네이티브 코드(기계어)로 변환시킨다
  6. 실행위 과정을 통해 변환된 기계어 코드는 JVM에서 실행됩니다
  7. 메모리관리 → JVM주기적으로 체크하며 메모리 효율 및 누수 등의 문제를 방지합니다.
  8. 종료 → 자바 프로그램이 실행을 마치면 JVM은 자원을 해제하고 종료시킵니다.

 

  • 부트스트랩 클래스 로더 (Bootstrap Class Loader)
    • JVM을 실행시키기 위한 핵심 클래스들을 로딩합니다.
  • 확장 클래스 로더 (Extension Class Loader)
    • 자바의 확장 클래스들을 로딩합니다. [Java9 이후 Platform Loader로 변경]
  • 시스템 클래스 로더 (System Class Loader)
    • $CLASSPATH에 설정된 경로를 탐색해 로딩합니다 [일반적으로 우리가 만든 클래스 파일을 로딩]

 

출처 :https://engkimbs.tistory.com/606

 

 

📝레지스터 구조

 

CPU는 RAM과 연결되어 있지만 보조기억장치에 바로 엑세스 불가능합니다.

CPU는 메모리에 있는 정보를 가져와서 CPU에서 처리후 메모리로 다시 보낸다

 

  • register
    • CPU에 해당 부분으로 엄청 빠르게 처리한다 [특정한 목적에 사용되는 일시적인 기억 장치]
    • 32bit =  = 4byte = 42억.... ( 1byte = 256 표현가능 ) 4바이트인 int형은 –21억 ~ 21억까지 표현 가능 → 한번에 429...을 처리 가능하다 그 값을 넘을 경우 register를 합쳐서 사용한다
    • 8비트 컴퓨터 한번에 8비트를 처리가능 -128 ~ 127 를 한번에 처리 가능 101011 이런식 16bit이면 300000000 + 40 을 처리할 때 레지스터가 16bit라서 범위를 넘어서 두개를 합쳐서 써야한다


레지스터는 명령어 등을 저장하는 임시공간이다. (RAM 역할을 하고 있다고 생각하면 됨)

 

   

 

📝C++ 메모리 구조

무슨 종류냐에 따라 저장되는 구조가 다릅니다.

 

 

🔗 참고 및 출처

https://engkimbs.tistory.com/606

https://yozm.wishket.com/magazine/detail/1979/

반응형
반응형
package array;

public class ForEach {

	public static void main(String[] args) {

		int[] scores = {95,70,40,50,20};
		
		int sum = 0;
		int count = 0;
		
		for (int score : scores) { // 배열 전체를 받는다
			sum += score;
			count ++;
		}
		System.out.println(sum);
		System.out.println(count);
		
	}

}

 

지금까지 배워온 내용하고 크게 다를거 없는데 for문이 좀 특이하게 생겼습니다.

scores의 인덱스 하나씩 받아가지고 score에 넣고 그 score를 이용해 사용가능합니다.

 

코드를 설명하자면 scores[0] 이 score에 들어가게되고 그게 scores의 배열 크기만큼 반복하게 됩니다.

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형
반응형

 

package scanner;

import java.util.Scanner;

public class ScannerExample {

	public static void main(String[] args) {
		
		Scanner Scanf = new Scanner (System.in); // 한번만 선언해서 쓰면 된다.
		float num2 ;
		int num;
		String str;
		
		do {
			System.out.println(">");
			num2 = Scanf.nextFloat(); // float형 입력하기
			System.out.println(num2);
		}while(num2 != 1.5);
		
		do {
			System.out.println(">");
			num = Scanf.nextInt(); // int형 입력하기
			System.out.println(num);
		}while(num != 0);
		
		do {
			System.out.println(">");
			str = Scanf.nextLine(); // 문자열 입력하기
			
		}while(!str.equals("q"));
		
		System.out.println("시스템을 종료합니다");

	}

}

따라치시는 분들한텐 에러가 날 수 있는데 빨간 줄이 나옵니다. 저 기능을 쓰려면 import라는 작업을 해줘야합니다.

 

import란 무엇이냐면 과자코너에 가면 과자 종류들이 여러개 있잖아요?

그런 거 처럼 비슷하거나 자주쓰이는 것이나 연관 있는 걸 모아 놓은 걸 쓰겠다고 선언한 겁니다.

 

java.util의 경우 사람들이 되게 자주이용하는 것들이 많이 들어있습니다.

자세한 건 진행하면서 배우는 걸로 하죠

 

이렇게 가져다대면 import해라 라고 설명까지 해줍니다. 단축키로는 Scanner에 가져다대고 Ctrl + Shift + o 를 누르면

자동으로 import됩니다.

 

이제 Scanner에 대해서 알아봅시다 Scanner란 직접 입력을 할 수 있는 것을 의미합니다.

먼저 Scanf라는 객체를 선언후 어떤 자료형으로 입력을 할지를 정해야 합니다.

 

num2의 경우 float형이죠? Scanf.nextFloat(); 라는 걸로 float형을 입력할 수 있습니다.

 

nextInt의 경우는 int형을 입력할 수 있게 합니다.

nextLine문자열을 입력할 수 있게 합니다.

 

뭔가 공통점이 있죠? Line빼고 뒤에 자료형이 대문자로 들어가는 것 이 점 참고해서 다른 자료형으로도 쓸 수 있습니다.

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형

'[Java] > [Java]' 카테고리의 다른 글

[Java] 자바 전역변수 지역변수  (0) 2021.07.02
[Java] 자바 반복문 (for - each문)  (0) 2021.06.14
[Java] 자바 2차원 배열 (Array)  (0) 2021.06.14
[Java] 자바 배열 (Array)  (0) 2021.06.13
[Java] 자바 String 문자열 객체  (0) 2021.06.13
반응형
package array;

public class TwoDemensionalArray {

	public static void main(String[] args) {
		
		int [][] arr = new int [2][3];
		
		for (int i = 0 ; i < arr.length ; i++) {
			for (int j = 0 ; j < arr[i].length; j++) {
				System.out.println("arr["+i+"]["+j+"] " + arr[i][j]);
			}
		}
		/*
		        arr[0][0] 0
			arr[0][1] 0
			arr[0][2] 0
			arr[1][0] 0
			arr[1][1] 0
			arr[1][2] 0
		 */

	}

}

2차원 배열이란 말 그대로 2차원형태입니다 

 

1차원은 이러한 형태이고

           

2차원은 이러한 형태입니다. 

     
     


지금 보여준 2행 3열 형태는 위에 자바코드에 있는 걸 그림으로 도식화한 것입니다.

선언방식 전에 배열과 아주 유사합니다 그냥 [] 하나 더 추가된 거밖에 없습니다.

 

 int     [][]  arr     = new   int        [2]      [3]

자료형 [][] 배열명 = new 자료형 [배열행][배열열]

 

arr[i].length를 보면 i가 처음에 0이기 때문 arr[0].length의 갯수 즉 3개입니다.

 

 

반응형
반응형

 

package array;

public class Array {

	public static void main(String[] args) {
		
		// ---------------------------- 방법 1 --------------------------
		
		int[] score = { 90 , 80 , 70 };
		
		// score[3]= 100; // 에러

		System.out.println("score[0]" + score[0]); // 90
		System.out.println("score[1]" + score[1]); // 80
		System.out.println("score[2]" + score[2]); // 70
		// System.out.println("score[3]" + score[3]); // 100
		
		
		int sum = 0;
		for (int i = 0 ; i < 3 ; i++)
		{
			sum = sum + score[i];
		}
		System.out.println(sum); //  240
		
		double avg = (double)sum / 3;
		System.out.println(avg); // 80.0

		// ---------------------------- 방법 2 ----------------------------
		
		int[] arr = new int[3];
		for (int i = 0 ; i < arr.length ; i++) {
			System.out.println("arr[" + i + "]" + " = "+arr[i]); // 0 0 0
		}
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		
		for (int i = 0; i < arr.length ; i++) {
			System.out.println("arr[" + i + "]"+ " = "+arr[i]); // 10 20 30
		}

	}

}

 

배열이란 같은 자료형의 값들을 여러개 받을 수 있는 구조입니다

 

어떠한 구조인지 대충 그림으로 표현한다면 이러합니다.

 

    score[0]       score[1]       score[2]

90 80 70 ....

 

또한 배열은 객체입니다. 그래서 Heap영역에 저장되고 그걸 참조하는 형식이죠

[0] , [1] ... 이러한 것들로 그 값에 접근합니다. [0], [1] 이러한 걸 인덱스라고 합니다.

참고로 String도 char의 배열입니다.


선언 방식은 크게 2가지입니다.

 

1. 선언과 동시에 값 넣기

 int []    score   = { 90 , 80 , 70 };

자료형  배열명  = 값들


1번의 특징은 배열의 크기를 안 정해줍니다. 하지만 값에 갯수에 따라 배열의 크기가 정해집니다.

하지만 뒤늦게 값을 추가할 순 없습니다.

 

2. 선언후 뒤에 값을 넣기

 

int[] arr = new int[3];

 int []    arr      = new int[3];

자료형  배열명  = new 배열 크기

 

arr[0] = 10;
arr[1] = 20;

arr[2] = 30;

 

2번의 특징은 3자리의 크기만큼 정해줍니다. 그리고 값을 나중에 추가할 수 있습니다.

 

저같은 경우는 2번같은 방법을 많이 썼습니다. 

arr.length배열의 크기를 구하는 메소드 입니다.

메소드가 뭐냐면 많이 썼던 것이 System.out.println("score[2]" + score[2]); 인데 무슨 동작을 해주는 역할을 해줍니다.

 

이거같은 경우는 출력해주는 역할을 해주죠 안에는 복잡한 구조로 돌아가지만

이러한 메소드(함수)를 만든 사람이 편하게 사용하라고 만든 것입니다. 복잡하게 출력하는 내용을 적을 필요 없이

System.out.println이라는 것만 쓰면 됩니다. 

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형
반응형

 

package string;

public class StringExample {

	public static void main(String[] args) {
		
		String str1 = "박은서"; 
        	// stack에 str1이 저장되고 heap 에 string형태 박은서가 저장
		String str2 = "박은서";
		
		if (str1 == str2) { // heap영역에 박은서가 1개이고 공유함
			System.out.println("참조주소값이 같다");
		}else {
			System.out.println("참조주소값이 다르다");
		}
		
		String str3 = new String("박은서"); // 나중에 값이 정해지는 경우
		String str4 = new String("박은서"); 
		
		if (str3 == str4) {
			System.out.println("참조주소값이 같다");
		}else {
			System.out.println("참조주소값이 다르다"); //heap영역에 박은서가 2개임
		}
		
		if (str3.equals(str4)) { // 문자열값은 같음
		System.out.println("str3 과 str4 는 문자열이 같음");
		}

	}

}

Char이라는 문자 하나만 받는 자료형이 있었죠? 그러면 문장으로 받을 수 있는 자료형은 없을까요?

만약 없다면 char를 + 로 붙혀가면서 해야하는 엄청 불편이 있습니다.

네 정답은 있습니다. String이라는 것입니다.

 

여기서 str1 str2를 변수라고 하지 않습니다. 객체라고 부릅니다. 그 이유는 나중에 클래스를 공부하면서 알아봅시다

 

객체라고 불리는 것들의 값을 비교하려면 .equals를 써야합니다. ==는 그 참조 주소값을 비교하는 걸 의미합니다.

그림으로 str1 , str2의 관계 str3 , str4의 관계를 보여드리겠습니다.

 

 

str1 과 str2는 똑같은 걸 참조하지만 str3과 str4는 다릅니다. 하지만 str3과 str4의 문자열은 같은 거죠

Heap 영역과 Stack 영역에 대해선 나중에 알려드리겠습니다.

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형
반응형
package for_while;

public class BreakContinue {

	public static void main(String[] args) {
		
		for (int i = 0 ; i <= 100 ; i = i + 2) {
			if(i >= 20 ) {
				break;
			}else {
				continue;
			}
		}
	}

}

continue와 break에 대해서 알아봅시다.

 

continue란 진행하다라는 의미죠 원래 중괄호가 끝나야 다시 위로 올라가서 i = i + 2를 하지만

continue를 만나면 바로 i = i + 2를 해주고 i <= 100을 합니다.

 

break란 중단하는 것이죠 반복문을 빠져나오게 합니다. for문이 2개라면 break문이 있는 for문을 탈출합니다.

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형
반응형

 

package for_while;

public class While {

	public static void main(String[] args) {
		
		int sum = 0;
		int i = 1;
		
		while (i <= 100) { // 참이면 실행
			sum += i;
			i++;
		}
		System.out.println(sum);
	}

}

 

package for_while;

import java.util.*;

public class DoWhile {

	public static void main(String[] args) {
		int sum = 0;
		int i = 1;
		do {
			sum += i;
			i++;
		}while (i <= 100);
		System.out.println(sum);

	}

}

while문도 for문과 동일하게 반복문입니다. 하지만 형태가 조금 다르죠

while문도 동일하게 조건에 맞으면 반복합니다. 하지만 i++같이 따로 설정은 안 해두면 영원히 반복할 수 있습니다.

 

do while의 경우 while문인데 먼저 실행하고 while문 조건을 나중에 따집니다.

 

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형
반응형
package for_while;

public class While {

	public static void main(String[] args) {
		
		int sum = 0;
		for (int i = 1; i <= 100 ; i++) {
			sum = sum + i; // i는 101이 돼서 나옴
		}
		System.out.println(sum);
		
		// ------------- 1 ~ 100 까지 합 ------------------
		
		for (int i = 1 ; i < 10 ; i++) {
			System.out.println("------------"+ i + "단입니다------------");
			for (int j = 1; j < 10; j++)
			{
				System.out.println(i + " X " + j + " = " + i*j);
			}
		}
		// -------------- 구구단 출력 -------------------------

	}

}

for문이 무엇이냐면 반복문입니다. 어떠한 작업을 반복해서 하죠 while문도 있는데 다음에 알아보도록 합시다

 

for (int i = 1 ; i <= 100 ; i++) 을 설명하자면 i = 1 이라고 처음에 초기값을 줍니다.

그다음 i <= 100 (1 <= 100) 인가요? 맞으면 중괄호 내용을 진행합니다 (sum = sum + i;)

중괄호가 끝나면 i++를 해줍니다. i <= 100 (2 <= 100) 인가요? .... 거짓이 나올 때까지 반복합니다.

 

이중 for문이란 그냥 for문 안에 for문이 들어간 것입니다.

 

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

   for (int j = 1 ; j < 10 ; j++{

    ....

   }

}

여기에서 i가 1로 들어가고 j가 10번 반복하게 됩니다 1 ~ 9까지 그리고 i가 2가 되고 j가 10번 반복... i가 끝날 때까지

 

https://github.com/SungJLee/My_Java_World.git

 

SungJLee/My_Java_World

Contribute to SungJLee/My_Java_World development by creating an account on GitHub.

github.com

 

반응형