1.
자바에서 하나의 프로젝트에서 처음으로 실행되는 부분을 Main함수 또는 Main 메소드라 한다.
public class Main
{
public static void main(String[] args)// 메인 함수
{
System.out.println("Hello World!");
}
}
println은 괄호에 들어가는 내용을 출력한 뒤에 한칸 줄바꿈을 하는 함수이다.
2.
변수는 프로그램이 실행되는 동안에 언제든 저장된 값이 변경될 수 있는 공간
상수는 변경할 필요가 없는 데이터이다.
Tip.
Error occured during initialization if boot lauyer
이 오류는 Module-Info.Java로 인해 일어나는 오류이다.
Module-Info.Java를 Don't create 혹은 create한 후 직접 삭제하면 해결된다.
public calss Main
{
public static void main(String[] args)
{
int intType = 100;
double doubleType = 150.5;
String stringType = "honeyricecake";
}
}
여기서 int, double, String은 자료형
그 옆의 intType, doubleType, StringType 은 변수명을 의미한다.
그리고 다음과 같이 final 키워드를 활용해 상수를 정의할 수 있다.
public class Main
{
final static double PI = 3.141592;
public static void main(String[] args)
{
//생략
}
}
위에서 final 은 한번 선언되면 바꿀 수 없다는 의미이고
static 은 하나의 클래스에서 공유되는 자원이라는 의미이다.
3. 자바의 출력, 자료형에 관한 팁
(1) System.out.println("a + b = " + (a + b));
이 때 a = 1, b = 2이면 이는 다음과 같이 출력된다.
a + b = 3
즉 자바에서 print에 이용되는 +는 앞의 것을 출력하고 뒤의 것을 출력한다는 의미다.
(2) 정수 변수 안에 실수를 넣으면 정수 부분만 변수에 저장된다.
이를 이용하여 실수 값의 반올림은 변수에 0.5를 더한 뒤 정수형으로 형변환을 하면 된다.
ex.
double x = 2.5;
int y = (int)(x + 0.5);
System.out.println(y);
출력되는 값은 3이다.
4. 자바의 자료형
String, Array, boolean, char, int, double 등이 자주 사용되는데
이 중 C언어와 두드러지는 차이점은 바로 boolean형과 String형이다.
public calss Main
{
public static void main(String[] args)
{
int a = 100;
System.out.println("10진수 : " + a);
System.out.format("8진수 : %o\n", a);
System.out.format("16진수 : %x\n", a);
}
}
자바는 기본적으로 정수를 출력할 때 10진수로 출력한다.
따라서 정수를 10진수가 아닌 8진수, 16진수로 출력하고 싶다면 format을 이용하여야 한다.
딘 format으로 format을 받아출력할 때는 개행문자(줄바꿈)가 자동으로 들어가지 않으므로 마지막에 직접 넣어줘야한다.
String은 내부적으로 class라는 것을 이용해 구현되어 있다.
그래서 String자료형에 대하여 정의된 함수들이 많은데 그 중 substring이라는 함수를 이용해 String자료형에 대하여 정의된 함수들의 사용법을 알아보자.
public calss Main
{
public static void main(String[] args)
{
String name = "Jane Doe";
System.out.println(name);
System.out.println(name.substring(0,1));
System.out.println(name.substring(3,6));
}
}
substring은 String의 부분문자열을 가져오는 함수인데
이 때 (3,6)등의 괄호는 3이상 6미만이라고 생각하면 된다.
즉, String의 3번째 칸부터 5번째 칸까지를 가져온다.
따라서 위의 main함수는 다음과 같은 결과값을 출력한다.
Jane Doe
J
e D
자료형들의 크기
int - 4바이트
long - 8바이트
float - 4바이트
double - 8바이트
boolean - X
char - 2바이트(C언어는 1바이트인데 이는 유니코드를 쓰기 때문이다.따라서 한글도 사용 가능)
5. 연산자
x++ : 1을 더하는 연산자, 다음 줄부터 x는 원래 값에 1이 더해짐
++X : 1을 더하는 연산자, 해당줄부터 x는 1이 더해져있다.
예시
public class Main
{
public static void main(String[] args)
{
int a = 40;
System.out.println("a는" + a + "입니다.");
System.out.println("a는" + a++ + "입니다.");
System.out.println("a는" + a + "입니다.");
System.out.println("a는" + ++a + "입니다.");
a++;
System.out.println("a는" + a + "입니다.");
}
}
이는 순서대로 40 40 41 42 43 이 출력된다.
? : 삼항 연산자
~ ? a : b 는 ~가 참이면 a를 리턴, 거짓이면 b를 리턴한다.
6.조건문
public class Main
{
public static void main(String[] args)
{
String a = "I Love You";
if(a.contains("Love")
{
System.out.println("Me too.");
}
else
{
System.out.println("I hate you");
}
}
}
String 이 내부적으로 가지고 있는 함수 contains, 어떤 문자열을 포함하고 있는지 검사하는 함수이다.
public class Main
{
public static void main(String[] args)
{
string a = "Man";
if(a.equals("Man"))
{
System.out.println("남자입니다.");
}
else
{
System.out.println("남자가 아닙니다.");
}
}
}
자바는 String을 비교할 때 equals()를 이용한다.//즉, == 사용불가!
그 이유는 Strign은 다른 자료형과 다른 비원시 자료형인 문자열 자료형이기 때문이다.
equalsIgnoreCase를 이용해 대소문자를 무시하고 같은지 아닌지를 판단할 수도 있다.
하나의 비교 연산자는 boolean형 연산자 true 또는 false를 반환하게 된다.
for(;;;) while(true)는 무한반복
단, break문을 통해 빠져나올 수 있다.
7. 기본 입출력
import java.util.Scanner;//스캐너라는 걸 import해야만 scanner를 이용가능, 마치 C언어의 헤더파일과 같은 역할
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner (System.in);
int i = sc.nextInt();
System.out.println(i);
sc.close;
}
}
sc는 함수가 아니라 인스턴스이다.
scanner 클래스의 인스턴스인 sc를 만들고 new Scanner(System.in)으로 초기화한다.
System.in은 콘솔창을 의미한다.
sc.nextInt를 통해 콘솔창에 입력되는 다음 정수를 입력받아 i에 넣어준다.
문자열 입출력 방법 :
1. next() : String형의 문자열을 입력받는다. 이 때 공백문자까지 입력받는다.
2. nextline() : 문자열을 입력받는데 다른 next~() 메소드와 다른 점은 줄단위로 입력받는다는 것이다.
8. 파일 입출력
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
File file = new FIle("input.txt");
try//아래의 문을 실행한다는 의미
{
Scanner sc = new Scanner(file);//scanner 대신 file
while(sc.hasNextInt())
{
System.out.println(sc.nextInt() * 100);
}
sc.close;
}
catch (FileNotFoundException e)//FileNotFoundException 이라는 오류가 발생하면 중괄호로 들어간다.
{
System.out.println("파일 못 찾음");
}
}
}
기본 입출력 팁
자바에서는 Scanner 클래스만 잘 활용해도 다양한 입출력 형태를 자유자재로 구사할 수 있다.
주석은 최대한 많이 작성하는 습관을 들이자.
8. 사용자 정의 함수
-> 하나의 문제를 잘게 분해 가능 (효율성이 증가한다.)
함수는 각각의 모듈로서 쉽게 수정되고 보완된다.
(자바에서 함수와 Method는 같은 의미)
import java.util.Scanner;
public class Main
{
public static int fuction(int a, int vb, int c)
{
int min;
if(a > b)
{
if(b > c) min = c;
else min = b;
}
else
{
if(a > c) min = c;
else min = a;
}
for(int i = min; i > 0; i--)
{
if((a % i == 0) && (b % i == 0) && (c % i == 0)) return i;
}
return 0;
}
public static void main(String[] args)
{
//중략
}
}
위와 같이 사용자 정의함수를 만들 수 있다.
(위의 함수는 최대 공약수를 구하는 함수이다.)
다른 예시
import java.util.Scanner;
public Class Main
{
public static char fuction(String input)
{
return input.charAt(input.length() - 1);
}
}
//생략
위의 사용자 정의함수를 이용하여 문자열의 마지막 글자를 출력할 수 있다.
charAt은 String에 정의되어 있는 함수로서 그 위치의 글자를 return하고
length 역시 String에 정의되어 있는 함수로서 그 문자열의 길이를 return한다.
Tip.
next -> 한 단어씩, 개행문자 무시 -> scanf와 같으나 개행문자를 버퍼에 남겨둔다는게 차이
nextline -> 한줄단위, 개행문자 받음
9. 배열
int[] array = new int[100];
이 때 new는 어떠한 변수(instance)를 만들 때 사용하는 하나의 약속이다.
C언어와 다르게 다음과 같이 선언 가능하다.
int x = 100;
int[] array = new int[x];
C언어는 다음과 같이 변수를 이용하여 배열을 할당하려면 malloc등의 동적할당을 활용해야 한다.
10. 클래스
클래스 - 현실 세계의 특정한 물건을 지칭한다고 생각하면 편하다.
ex. Node클래스 : 하나의 장소나 위치를 의미할 수도 있으며, 자료구조에서 말하는 이진 트리의 하나의 서브 트리가 될 수도 있다.
또한 개발 프로젝트에서는 종종 Student 클래스와 같이 하나의 처리할 데이터 단위를 명시하는데 사용된다.
ex.
car 클래스 - 속력, 색상, 이름 등등
이렇게 만들고 나면 new car(); 로 새로운 차 변수를 만들 수 있다.
이를 객체 지향 프로그래밍이라 한다.
예시
public class Node
{
private int x;
private int y;//노드의 특성 x,y
//private으로 만드는 이유 - 외부에서 한번에 접근할 수 없음->자바의 객체지향 프로그래밍은 보안을 굉장히 중요시한다.
public int getX()
{
return x;
}
public void setX()
{
this.x = x;//변수명이 겹치므로 this를 이용해준다. this는 클래스의 특성 x를 의미
}
public int getY()
{
return y;
}
public void setY(int y)
{
this.y = y;
}
public Node(int x, int y)//생성자, 객체를 하나 만즐어줄 때 자동으로 초기화해주는 함수
{
this.x = x;
this.y = y;
}//클래스와 동일한 이름을 가지고 있다는 것이 생성자의 특징이다.
public Node getCenter(Node other)
{
return new Node((this.x + other.getX()) / 2 , (this.y + other.getY) / 2);
}
}
이런 식으로 만들고 나서 Main에서 활용할 수 있다.