# 기본 main 함수를 포함한 클래스
public class HelloWorld
{
# main 함수는 public static으로 선언되어 있고, 프로그램 실행시 Entry Point로 작용
public static void main(String[] args) // main 함수
{
System.out.print("Hello, World!");
}
}
Q. main 함수가 public static으로 선언해야 하는 이유?
main 메소드 같은 경우는 객체를 생성하지 않아도 자동으로 실행되어 작업을 수행해야하는 부분(프로그램의 Entry Point)이기 때문에 static으로 선언합니다. JVM은 실행 시점에 static 함수 중, 이름이 "main"으로 되어 있을 경우, 자동으로 호출합니다. JVM이 main 함수가 어디에 있건 접근 가능해야하기 때문에 public을 사용합니다.
# Java 프로그램의 작동 프로세스
HelloWorld.java (Java 사용자 문법으로 작성한 텍스트 파일) -> Compiler(컴파일 수행, 명령어 : javac HelloWorld.java)
-> HelloWorld.class (컴퓨터가 이해 가능한 언어로된 파일) -> JVM(프로그램 실행, 명령어 : java HelloWorld)
-> "Hello World" (프로그램 수행 결과)
# 기본 자료형 & 같이 사용하는 연산자
유형 | 자료형 표현 | 자주 쓰는 연산자 | 예시 |
정수형 | int | + - * / %(나머지 연산) | int a = 1; |
실수형 | double | + - * / | double a = 2.5 |
논리형 | boolean | &&(And) ||(Or) !(Not) | true false |
문자형 | char | 'A' '1' '%' '\n' | |
문자열형 | String | + | "ABC" "1" "2.5" |
Q. java의 자료형의 종류?
기초형(primitive type)과 참조형(reference type)의 자료형이 있다. 기초형은 다시 정수형(int, long), 실수형(float, double), 문자형(char), 논리형(boolean)으로 분류할 수 있고, 참조형에는 클래스(String, 사용자 정의 Class), 배열(int[]), 인터페이스(interface)가 있다.
Q. 추가로 알면 좋은 것들?
실수형 변수와 정수형 변수를 같이 사용하여 사칙연산할 경우, 결과값은 실수 형식으로 떨어진다. 그러나 정수형 변수에 담으면, 소수점은 유실된다.
# 정수형과 실수형을 같이 사용할 경우, 결과값은 실수형을 기준으로 계산됨
int a = 1.64 * 1; // 1.64 (a에는 1만 담김)
# 실수형에서는 나머지도 소수이다.
double a = 10.0 % 3.141; // 0.577
# 정수형에서는 0으로 나눌 수 없음
int a = 1 / 0; // Runtime Error
# 0으로 수렴하는 값으로 나누면 결과값은 무한대
double a = 1.0 / 0.0; // Infinity
# 숫자의 루트 연산 값 (어떤 숫자를 제곱해야 해당 숫자가 나오는지 궁금할 때)
double a = Math.sqrt(2.0); // 1.41421356...
// a^2 = 2.0
# 두개를 곱해서, 음수가 나오는 수는 없음
(수학에서 i라는 기호로 제곱하면 -1이 나오는 허수를 새롭게 정의해서, 수체계에 편입시키는 방법도 있었음)
double a = Math.sqrt(-1.0); // NaN
# 변수의 선언과 할당
- 선언 : <기본자료형 또는 참조형> <신규변수명>[ , <신규변수명2> ];
# 논리형
- 할당 : <기존변수명> = <변수값>;
- 선언 및 초기화 : <자료형> <신규변수명> = <초기 변수값>;
# "자료형 변수이름" 형식으로 새로운 변수를 선언할 수 있음
int a, b;
# "변수이름 = 변수값" 형식으로 값을 할당할 수 있음
a = 10;
# "자료형 변수이름 = 변수값" 형식으로 선언과 할당을 동시에 할 수 있음
int c = a + b;
# 비교 연산자
== , != , < , <= , > , >=
# 예시로 알아보는 비교 연산자
(year % 100) == 0 ? "세기의 시작입니다" : "아닙니다"
(month >= 1) && (month <=12) ? "정상적인 달입니다" : "아닙니다"
# 표준 출력함수
printf() 함수에서, 가장 앞에 나오는 format의 경우 숫자를 사용하지 않을 경우, 아래와 같이 매칭된다.
%d : 정수형 값을 문자열로 그대로 출력할 때
%f : 실수형 값을 문자열로 그대로 출력할 때(우리 눈에 친숙한 형태로 보여짐)
%e : 실수형 값을 문자열로 그대로 출력할 때(e 기호를 활용해서, 소수점이 보여짐)
%s : 문자열 값을 문자열로 그대로 출력할 때
%b : 불리안 값을 문자열로 그대로 출력할 때(true or false)
# 한줄 출력
System.out.print(String s);
# 한줄 출력 후, 줄바꿈
System.out.println(String s);
# 단순 줄바꿈
System.out.println();
# 사용자 정의에 맞게 문자열 출력
- 정수를 "총 N글자"만큼 문자열로 출력 (채우지 못한 위치는 빈값으로, 숫자는 맨 뒤부터 채움)
System.out.printf("%12d", 12345678); // " 12345678" (앞에 빈칸 4개)
- 정수를 "총 N글자"만큼 앞에서부터 채워서 문자열로 출력 (채우지 못한 위치는 빈값으로, 단 숫자는 맨앞부터 채움)
System.out.printf("%-12d", 12345678); // "12345678 "(뒤에 빈칸 4개)
- 실수를 "소수점 N자리"만큼 문자열로 출력
System.out.printf("%.7f", 159.123456789); // "159.1234567"
- 실수를 "총 14자리, 소수점은 7자리까지"만큼 문자열로 출력
System.out.pringf("%14.7f", 1234.123456789); // " 1234.1234567"(앞에 빈칸 3개)
- 문자열을 "총 N글자"만큼 출력 (채우지 못한 위치는 빈값으로)
System.out.printf("%12s", "Hello World") // " Hello World"(앞에 빈칸 1개)
- 문자열을 "총 N글자"만큼 앞에서부터 채워서 출력 (채우지 못한 위치는 빈값으로, 앞에서부터 채우기)
System.out.printf("%-12s", "Hello World") // "Hello World "(뒤에 빈칸 1개)
- 문자열을 "총 N글자, M글자만 잘라서" 앞에서부터 채워서 출력
System.out.printf("%-12.5s", "Hello World") // "Hello "(뒤에 빈칸 7개)
- 논리형을 문자열로 출력
System.out.printf("%b", true) // "true"
# 표준 입력 함수
StdIn.readLine(); 함수가 대표적이다. 더 필요할 경우, StdIn 라이브러리를 찾아보자.
# 표준 Drawing 함수
StdDraw.line(x0,y0, x1, y1); 함수가 대표적이다. 더 필요할 경우, StdDraw 라이브러리를 찾아보자.
# 표준 Audio 함수
StdAudio.play(file Name); 함수가 대표적이다. 더 필요할 경우, StdAudio 라이브러리를 찾아보자.
# 표준 랜덤 함수
StdRandom.uniform(int n); // 0부터 n-1 사이의 랜덤 수 반환. 더 필요할 경우, StdRandom 라이브러리를 찾아보자.
StdRandom.gaussian(); //정규화, 평균이 0, 표준편차가 1?
# 표준 통계 함수
StdStats.mean(double[] a); 함수가 대표적이다. 더 필요할 경우, StdStats 라이브러리를 찾아보자.
# 표준 Color 객체
Color(int r, int g, int b); 객체가 대표적이다. 더 필요할 경우 , java.awt.Color 라이브러리를 찾아보자.
# 표준 Picture 객체
Picture(file Name); 객체가 대표적이다. 더 필요할 경우, Picture 라이브러리를 찾아보자.
# 형변환
# 문자열(숫자) -> 정수형
int a = Integer.parseInt(String s);
long a = Long.parseLong(String s);
# 문자열(숫자) -> 실수형
double a = Double.parseDouble(String s);
# 정수형 -> 문자열(숫자)
String a = String.valueOf(7);
String a = "" + 7;
# 실수형 -> 정수형
int a = (int)1.2; // 1
# Math 라이브러리
# 절대값 구하기
int val = Math.abs(-1.2); // 1.2
# 둘 중 큰 값 구하기
int bigVal = Math.max(1.2, 2.4); // 2.4
# 둘 중 작은 값 구하기
int smallVal = Math.min(1.2, 2.4); // 1.2
# 제곱 (a를 n번 곱한 값은 얼마일까?)
Math.pow(10, 7); // 10^7
# 루트 (어떤 수를 제곱해야 a가 나올까?)
Math.sqrt(1.2); // 루트(1.2)
# 가까운 정수로 반올림
int val = Math.round(1.5); // 2?
# 랜덤 수(0~1 사이의 수)
int randomVal = Math.random() * 1000; // 233
# 삼각함수
Math.sin(1.2), Math.tan(1.2), Math.cos(1.2);
# 각도 <-> Radians
Math.toRadians(60), Math.toDegrees(1.5);
# Exponential
Math.exp(a); // e^a
# 자연로그(e)
Math.log(a); // log(e) a
Math.log(Math.E); // log(e) E = 1;
# 수학 상수
Math.E // e의 값
Math.PI // 3.14....
# 조건문 (if / switch)
if (x > y)
{
int t = x; // swap 아이디어
x = y;
y = t;
}
else if (x == y)
{
}
else
{
}
switch(a){
case 1:
break;
case 2:
break;
default:
break;
}
# 반복문 (while/for/foreach)과 break/continue 문
# 먼저 반복문 조건을 체크 후, 실행함
while(power <= n/2) // 조건문
{
power = 2*power; // 증감문
}
for(int i = 0; i <= n; i++) {
System.out.println(i + " " + power);
if (i == 7){
continue;
}
power = 2*power;
}
for(int i : arr){
System.out.println(i + " " + power);
power = 2*power;
if (i == 7){
break;
}
}
# 최초 1회 수행 후, 반복문 조건을 체크함
do
{
x = 2.0*Math.random() - 1.0;
y = 2.0*Math.random() - 1.0;
} while(Math.sqrt(x*x + y*y) > 1.0);
# 배열
# 배열 생성
String[] arr = {"A", "B", "C"};
double[] arr = new double[n];
for (int i = 0; i < n; i++){
a[i] = Math.random();
}
# 배열 출력
for (int i =0; i < n; i++)
{
System.out.println(arr[i]);
}
# 최대값 출력(최대값 아이디어 적용)
double max = Double.NEGATIVE_INFINITY; // 초기값을 가장 작은 값으로
for (int i = 0; i < n; i++) {
if (arr[i] > max){
max = a[i];
}
}
# 평균값 출력
double sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
double average = sum / n;
# 배열 거꾸로(Swap 아이디어 적용)
for( int i = 0; i < n/2; i++) {
double t = arr[i];
arr[i] = arr[n-1-i]; // n-1이 마지막 index
arr[n-1-i] = t;
}
# 배열 복사
double[] b = new double[n];
for(int i = 0; i < n; i++){
b[i] = a[i];
}
# 이중배열
단순 배열은 한줄짜리 row를 표현할 수 있다.
이중 배열에서는 여러 개의 row가 있는 table 또는 2차원 좌표를 표현할 수 있다.
삼중 배열은 3차원 좌표를 표현할 수 있다.
String[] row = new String[colCnt];
String[][] table = new String[rowCnt][colCnt];
# n번째 Row 배열은?
String[] row = table[n-1];
# 2번째 Row의 3번째 Column은? 둘다 0번 index에서 시작하므로, 1씩 빼주어야 함
a[1][2];
# Command Line에서 인자값을 받고, 자바 프로그램이 실행되는 방식
public class MyProgram
{
public static void main(String[] args)
{
int n = Integer.parseInt(args[0]);
int sum = 0;
for (int i = 0; i < n; i++)
{
int value = StdIn.readInt(); // Command Line에서 한줄씩
sum += value;
}
StdOut.println("Sum is " + sum);
}
}
# cmd창
java MyProgram 7 //java 명령어와 함께 전달된 7이라는 Argument는 args[0]으로 전달됩니다.
1
2
3
4
5
6
7 // 그 이후 입력된, 7개의 숫자는 StdIn.readInt()로 읽어올 수 있습니다.
Sum is 28 //StdOut.println(s)로 결과 문자열을 출력할 수 있습니다.
# 함수 선언
- 선언 : [접근제어자] [static여부] <반환 자료형> <함수명>(<입력자료형> <변수명>){ }
# 0부터 N까지 더한 숫자 반환
public static double addAll(int n)
{
double sum = 0.0;
for(int i = 0; i <= n; i++){
sum += i;
}
return sum;
}
# 소수 여부 반환
public static boolean isPrime(int n)
{
if (n < 2) return false; // 예외 사항 조치
if (n == 2) return true;
for(int i = 2; i < n; i++){ // 소수의 정의가 중요하다. 자기 자신과 1만 약수로 가짐
if (n % i == 0){
return false;
}
}
return true;
}
# 대각선의 길이 찾기
public static double hypotenuse(double a, double b)
{
return Math.sqrt(a*a + b*b);
}
# 문자열 String 조작
String s;
s = new String("Hello, World"); // 새로운 객체 선언
s = "Hello, World"; // 내부적으로는 new String("Hello, World") 수행;
# 문자열의 길이 가져오기
int len = s.length(); // 12
# 문자열의 일부 가져오기
String ss = s.subString(1,2); //1번째 인덱스부터, 2글자를 추출
# 문자열의 N번째 캐릭터 가져오기
char c = s.charAt(7); // 'W', String 객체가 지원하는 charAt() 함수
# 문자열의 포함여부, 시작여부, 끝여부, 같은지
boolean isContain = s.contains("Hello");
boolean isStartsWith = s.startsWith("Hello");
boolean isEndsWith = s.endsWith("World");
boolean isEquals = s.equals("Hello, World");
boolean isMatch = s.matches("\s"); // 정규식 매치여부
# 문자열 위치 검색
int idx = s.indexOf(",");
int idx = s.indexOf(",", 2); //2번째 index 이후, ","를 검색
# 문자열 Merge
String m = s.concat(s);
# 문자열 대소 비교
int ret = s.compareTo("Hello, Korea"); // 1 or 0 or -1, MINUS 라고 생각하면 된다.
# 대소문자 변환
String lowerCase = s.toLowerCase();
String upperCase = s.toUpperCase();
# 문자열 바꾸기
String ret = s.replace("Hello", "Hi");
# 문자열 나누기
String[] arr = s.split(";");
# char[]을 문자열로 바꾸기
String s = new String(char[]);
# 문자열 양옆 빈칸 지우기
String s = " Hello, World "; // "Hello, World"
# 클래스
객체의 경우, 객체 내부의 멤버 변수와 생성자, 함수로 구성되어 있다.
public class Charge
{
# 클래스 멤버변수 선언
private final double rx, ry;
private final double q;
# 클래스 생성자 선언
public Charge(double x0, double y0, double q0)
{
rx = x0; ry = y0; q = q0;
}
# 클래스내 멤버 함수 선언
public double potentialAt(double x, double y)
{
double k = 8.99e09;
double dx = x - rx;
double dy = y - ry;
return k * q / Math.sqrt(dx*dx + dy*dy);
}
}
# 자료구조 객체
# 스택(Stack) FIRST IN LAST OUT
Stack<String> stack = new Stack<String>();
stack.push("value1");
stack.push("value2");
stack.push("value3");
if(!stack.isEmpty()){
stack.pop();
}
stack.size();
# 큐(Queue) FIRST IN FIRST OUT
Queue<String> q = new Queue<String>();
q.enqueue("value1");
q.enqueue("value2");
q.enqueue("value3");
if(!queue.isEmpty()){
q.dequeue();
}
q.size();
for(String s: q){
System.out.println(s);
}
# 딕션너리(ST, SymbolTable), Key, Value
ST<String, String> st = new ST<String, String>();
st.put("keyName", 12);
st.get("keyName");
st.remove("keyName");
st.contains("keyName");
st.size();
st.keys();
# 집합(SET) : 중복을 허용하지 않는 리스트
SET<String> set = new Set<String>();
set.add("value"); // 특정 값을 추가
set.remove("value"); // 특정 값을 제거
set.contains("value"); // 특정 값을 포함하고 있는지
set.size(); // 집합의 값 개수
# 리스트(List) : 단순 추가 리스트
List<String> list = new ArrayList<String>();
list.add("a");
# 그래프(Graph) : Node와 Edge의 집합
Graph graph = new Graph();
Graph graph = new Graph(fileName, ";"); // 파일에서 text를 불러오고, ;로 나눈 것을 Node로 하는 그래프 생성
graph.addEdge("a", "b"); // a-b간 edge 생성
graph.V(); //vertices의 모든 멤버
graph.E(); //edges의 모든 멤버
Interable<String> vertices = graph.vertices(); //그래프의 모든 노드 반환
Interable<String> neigbors = graph.adjacentTo("a"); //a 노드에 인접한 모든 노드 반환
int degree = graph.degree("a"); //a 노드에 인접한 이웃의 개수
graph.hasVertex("a");
graph.hasEdge("a", "b");
# Iterable<String>
탐색 가능한의 의미로, List, Queue, Stack과 같은 자료구조에서 인터페이스로 구현된다.
특징은 객체내에 "커서"의 개념이 있어서, 순차 탐색시 사용되고, next()와 remove()를 index없이 사용한다.
queue.hasNext();
stack.hasNext();
queue.next();
queue.remove();
최근댓글