JAVA 1

Leafy·2023년 12월 4일
0

중앙_자바

목록 보기
4/76

Java는 원래 가전제품?에 넣으려고 만든 것.

Java21의 특이한 점을 알아봐도 좋다.

Java8이 있는데, Java11이나 Java17을 깔아보는 것도 좋겠다.

openJDK따로 오라클JDK 따로, 마소에서 만드는 JDK 따로, 아마존 JDK 따로.

기본 근간은 오라클에서 만들어주는 건데 큰 차이는 없다.

LTS버전 아니면 업뎃 안해주니까 LTS 써야.


객체 지향과 절차 지향

객체 지향 - Java, C++, C#
절차 지향 - C

  • 객체 지향 장점
    : 모듈을 재활용, 업그레이드와 디버깅이 쉽다.
  • 객체 지향 단점
    : 설계(디자인)에 시간이 많이 걸림. 데이터 접근이 느림.

-> 프로그램 짤 때 다시 쓸 거 생각해서 만들 것. 불러다 쓸 생각을 해서.
한 가지 기능만.


JDK

Java SE - 스탠다드 (이거 씀)
Java EE - 엔터프라이즈. 대용량 서버용
Javs ME(Micro Edition) - 휴대폰, pda 등 임베디드용. 제한된 자원을 가진 디바이스용.

Java 특징

  • 혼란 주는 요소 없앰. (C나 C++의 전처리, 포인터, 구조체, 공용체, 다중상속 등)
  • 플랫폼 독립적
  • 소스코드(.java), 바이트코드(.class) 2개 파일 나옴.
  • 가비지 컬렉터로 메모리 관리해줌.

Java로 할 수 있는 것

  • 자바 어플리케이션: pc에서 단독 실행 가능한 어플리케이션
  • 자바 서블릿(Java Servlet)
  • JSP: 자바와 html 결합. 웹서버에서 실행되고, 결과만 전송.

이클립스 단축키

자동완성 ctrl+space 가장 많이 쓸 것.

코틀린은 JVM 위에서 돌아간다. (구글과 오라클이 싸워서 구글이 탈Java하려고 만듦)

d2coding ver1.3.2
1은 실제 버전, 3은 홀짝이 있는데 짝수가 좀더 안정적이고 홀수는 약간 테스트 버전같은(메이저, 마이너라고 한다)... 2는 패치가 2번 있었다는 말.

새 프로젝트 때 모듈 안 쓴다.

프로젝트 폴더 우클릭 - build path - java build path 에서 library
java 1.8로 바꿨다.

src 폴더 안에 새 class 만든다.

Java 코드

public class HelloWorld {//클래스
	public static void main(String[] args) {//메소드
		System.out.println("Hello World");//명령문장
		//한줄주석
		/* 문단주석 */
		/** 문서 주석*/ // 내가 쓴 주석을 문서로 만들 때 씀.
	}
}
  • 클래스
    클래스는 왼쪽에 붙어 있다. 대문자로 시작, 1개~ 2개???
  • 메소드
    한 번 들여쓰기 돼있음. 소문자로 시작.

정렬 단축키
ctrl+shift+F

//이거 3가지 구분이 목표.
//클래스 : 객체가 될 수 있는 최소 단위.
//메소드 : function. 명령 단위. 명령문장의 집합. 하나의 기능을 한다.
//명령문장 : 세미콜론(;)으로 끝나요.

//클래스는 메소드, 명령 문장을 다 품고 있음.
//메소드는 명령 문장을 품고 있음.

java는 main 메소드가 닫히면 프로그램이 끝남.

이름 표기법

package dec04;
//클래스, 메소드, 명령어 이름 만들기
//1. 사용 가능한 문자 : 영어 대문자, 소문자, 숫자, 특수문자(_, $)
//2. 숫자는 맨앞에 올 수 없다.

// 클래스 이름 : 영문자 대문자로 시작 Apple
// 				 두 단어의 조합일 경우 AppleKorea = 파스칼 표기법
// 메소드 이름 : 영어 소문자로 시작 apple
// 				 두 단어의 조합일 경우 appleKorea = 카멜 표기법
// 변수 이름 : 카멜 표기법
// 상수 이름 : 모든 단어를 대문자로 APPLE
// 				두 단어의 조합이라면 APPLE_KOREA = 스네이크 표기법

public class Name {//Name 클래스
	public static void main(String[] args) {//main 메소드
		int num = 100;//num 변수
		int APPLE_COUNT = 10;//상수
		String name = "홍길동";//String 지역변수 선언 = 문자열
	}
}


// 프로그램에서의 ;의미(중요★★★★★)
/*
 * 프로그램에서는 대략 3가지 명령이 존재한다.
 * 선언(Declaration), 대입(Assign), 초기화(Initialization)
 * 이외 특정 명령을 실행하는 명령( 예)콘솔 출력 명령 등)
 * 이러한 명령 끝에는 반드시 하나의 명령이 끝났다는 의미로
 * 세미콜론을 붙여준다.
 * 단 예외도 존재. (같은 타입의 변수를 연속적으로 선언 시, 나중에..)
 * 예외는 무시하고 위 규칙을 기억.
 * 
 */

데이터 타입

https://velog.io/@gillog/%EC%9B%90%EC%8B%9C%ED%83%80%EC%9E%85-%EC%B0%B8%EC%A1%B0%ED%83%80%EC%9E%85Primitive-Type-Reference-Type

자바에서 쓰는 최소 단위가 1바이트여서 불리언 타입은 1비트만 쓰는데도 1바이트 씀.

옛날에는 램용량 적어서 크기 맞는 타입 잘 지켰는데, 요즘은 그럴 정도 아님.
하지만 램용량 적은 디바이스 할거면... 하는 게 좋지.

형변환은
byte < short < int < long < float < double 취급

//변수 선언
//데이터타입 변수명 = 값;
byte num = 126;
byte num02 = num + 1; //정수 기본타입 int여서 연산한 건 byte 안됨.
byte num03 = 126 + 1; //이건 된다.
  • 값 절삭...
    byte에 담을 숫자 초과하면, 되돌아가서 찍음.
    128 저장하면 -128
    129는 -127 이런 식으로
    -129는 128, 5200은 80 이런 식.

리터럴
https://velog.io/@pjeeyoung/%EB%A6%AC%ED%84%B0%EB%9F%B4

//실수 float double
float pi = (float) 3.14;
		
double pi2 = pi;
		
int number = 150;
double pi3 = number;
System.out.println(pi3); //150.0
		
pi3 = 3.14;
System.out.println(pi3);//3.14
number = (int) pi3;
System.out.println(number);//3
		
char ch = '\uAC00';//문자는 홑따옴표,, 유의하자. 아스키코드, 유니코드 다 됨.
System.out.println(ch);
		
ch = 97; //리터럴
System.out.println(ch); // 아스키코드표
System.out.println((char) (ch + 1)); // 아스키코드표
		
//0 ~ 127
System.out.println((int) ch);//97
System.out.println((int) 'a');//97
		
//상수
final int FINAL_INT = 30; // 상수 뒤에 보통 리터럴로 적어주긴 한다.
// final int FINAL_INT = num03; // 이런 식보단 리터럴...

//논리타입 = 참/거짓
		
boolean check = false;
System.out.println(check);
		
check = check != true; // == 같아?		!= 다르다?
//    2        1      연산 순위(?)
// <================  값의 흐름을 생각해~
System.out.println(check);
		
if(check) {
	System.out.println("check가 참입니다.");
} else {
	System.out.println("check가 거짓입니다.");
}

var iii = 10; //추론타입. java11부터. 있긴 한데 자주 쓸 일이...

int number;
if (false) { //절대 실행할 수 없는 코드...
	number = 100;
}
		
System.out.println(number); //지역변수는 반드시 값이 초기화 돼있어야.
  • 함수 이름 똑같이 만들지 말자.
    : 이름 같아도 받아들이는 파라미터 타입 다르면 ㄱㅊ은데, 그래도 이름 다르게 하자~~
public static void main2() {
		
}
	
public static void main2(int a) {
	int number = 100;
	int main2 = 100;
}

문제

public class Hello {
	public static void main(String[] args) {
// 1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오. (단 점들의 배열은 모두 정렬되어있다고 가정한다.)
// 예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 될 것이다.
		
		// 차이... 적은...
		int[] S = {1, 3, 4, 8, 13, 17, 20};
		
		int[] ansArr = new int[S.length-1];
		
		// 배열 요소 집어넣기
		for (int i = 0; i < S.length-1; i++) {
			ansArr[i] = S[i+1] - S[i];
			System.out.println(ansArr[i]);
		}
		
		// 최솟값 찾기
		int minValue = 10;
		int minIndex = 0;
		for (int i = 0; i < ansArr.length; i++) {
			if (ansArr[i] < minValue) {
				minValue = ansArr[i];
				minIndex = i;
			}
		}
		System.out.printf("minValue: %d, minIndex: %d", minValue, minIndex);
		System.out.println();
		
		// 최솟값 인덱스 써서 쌍 구하기.
		System.out.printf("가장 가까운 쌍: (%d, %d)", S[minIndex], S[minIndex+1]);
		
		

	}
}

0개의 댓글