자바를 공부하면서 배운 자잘한 정보들 및 잘 모를것 같은, 주의해야할 것들을 모은 곳이다.
자료형(Data type)
1. int 타입은 약 +-20억까지 표현할 수 있다.(그 이상이면 long)
2. float 타입은 float haha=0.23f;같이 뒤에 f를 붙여준다.
3. 변수를 초기화하지 않고 선언만 한 경우, 숫자는 0, 문자열은 null(""), boolean은 false, 문자는 '\0'(null 문자, ' ', '\u0000')가 된다. (다 의미는 같다. '\0', '\u0000'은 같지만 ' '과 둘은 서로 다르다고 나온다. 하지만 의미는 같다.)
4. byte, short형은 자동으로 int로 형변환되어 계산된다.
5. String 타입은 참조형이라 둘이 비교할 때, equals 메소드를 사용해야 한다. 이것도 null이면 안되므로 a != null && a.equals(b)같이 해줘야한다.
자료구조(Data structure)
1. int 타입은 약 +-20억까지 표현할 수 있다.(그 이상이면 long)
https://nukoori.tistory.com/10
연산자(operator)
1. 복합대입연산자는 += *= /= %= -= 이 있다.
2. 삼항연산자는 비교 ? true일 때 : false일 때; 이다.
3. 2의 보수 -> 1의보수+1, 가장 처음 만나는 1까지 유지하고 뒤집으면 된다.
4. 비트이동연산자는 >>(기존 부호비트 유지), >>>(무조건 0으로 채워짐)가 있다.
5. printf("%04d", 3)이면 4자리수로 만드는데 4자리수가 안되는 경우 0으로 채워달라는 뜻이다.
6. XOR 연산자는 ^로 다른건 1로 같은건 0으로 만들어준다.
7. ~는 보수다. 비트가 0이면 1, 1이면 0으로 만들어준다. 2의 보수면 ~num+1해주면 된다.
8. 연산자 우선순위는 위와 같다.
반복문
1. do while(조건문); -> 세미콜론을 붙여야한다.
2. for each문 -> for(int(대상의 자료형) num(변수) : nums(반복하고자 하는 대상)){} 이런느낌. 모든 원소를 순회할 때 활용하면 편리한 반복문이다. 2차원배열에서는 for(int[] arr : arrs){} 같이 사용한다. for each문은 변수의 값을 수정하는건 안된다.
public static void main(String[] args) {
Loop1:
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if(j==7) break Loop1;
System.out.println("i = " + i + " j = " + j);
}
}
}
3. Labeled Loop문이다. 반복문에 이름을 붙여 사용하는 것으로 나가고자 하는 자리에 Loop1:같이 해두고 특정 조건을 만족하면 break를 통해 탈출이 가능하다. 보통 위 경우 break문을 사용하면 안쪽 반복문만 탈출하는데 Labeled Loop를 통해 바깥쪽 반복문까지 탈출하도록 만드는 것이다. 레이블은 사용처보다 위쪽에 위치해야한다.
클래스(Class)와 객체(Object)
1. 클래스를 만들 떄는 class 클래스명 {}같이 중괄호를 쓰고, 다 만들고 ; 은 없다.
2. 클래스 내부의 메소드 오버로딩은 이름만 같고, 매개변수 개수 혹은 타입이 달라야한다. (리턴타입 차이로는 안됨)
3. 해당 클래스의 객체들이 static 클래스 변수값을 공유하고, 객체를 생성하지 않아도 클래스 이름만으로 static 클래스 메소드를 사용할 수 있다.
4. static 메소드에서 사용되는 변수도 static변수여야 한다.
5. overloading은 하나의 클래스에서 같은이름의 여러 메소드를 정의하는 것이고, overriding은 부모 클래스의 메소드를 자식 클래스에서 재정의하는 것이다.
6. 상속은 class 자식 클래스명 extends 부모 클래스명 {} 같이 만든다.
7. 다형성은 부모가 자식의 객체를 받아서 쓸 수 있다. 이때 자식에만 있는 메소드는 못쓴다. instanceof는 해당 자식것까지 true를 반환한다.
8. 추상클래스를 상속받아 자식클래스를 만들때는 추상클래스는 불완전한 클래스기 때문에 생성자에서 추상클래스의 변수는 this를 통해 초기화한다다. 일반 클래스를 상속받았을 때는 부모 클래스의 변수는 super를 통해 초기화한다.(뇌피셜)
9. 익명클래스를 만들 때에는 ;이 붙는다.
10. 클래스는 자바 프로그램 단위, 보통 하나의 클래스는 하나의 소스 파일로 구성된다.
https://nukoori.tistory.com/11
IntelliJ IDEA
1. run한 부분을 아래가 아닌 다른쪽으로 옮기고 싶을땐 run 키를 드래그해서 옮겨주면 된다.
2. 파일경로는 해당 파일 우클릭, terminal 하고, pwd를 입력해보면 된다.
패키지(Package)
1. 패키지는 다양한 자바 클래스가 모여있는 폴더이다. package 키워드를 이용하여 패키지를 생성한다.(소문자)
2. 자바 파일 소스코드상 맨 앞(위)에 위치한다. 패키 이름에서 마침표(.)을 찍어서 하위 폴더를 정의한다.(폴더라고 생각하면 된다.)
기타
1. 자바는 플랫폼 독립적(운영체제에 따른 코드 재작성 불필요), 객체지향적(프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아닌, 수많은 객체(object)라는 단위로 나누고 이들의 상호작용으로 서술하는 방식, 객체는 하나의 역할을 수행하는 메소드와 변수(데이터)의 묶음으로 본다. 절차지향언어에 비해 생산성이 높고 보안성이 좋다고 함) 언어이다.
2. .java라는 곳에 프로그래밍을 해서 코드를 만들면 자바 컴파일러가 컴퓨터가 이해가능한 언어로 변환, 그렇게 바이트 코드(.class)라는 걸 만들어준다. 각 운영체제에 맞는 JVM(Java Virtual Machine)라는 가상머신환경에서 실행한다. 그래서 플랫폼 독립적이라는 것이다. 메모리관리도 JVM의 garbage collector라는 모듈에서 해주게 된다.
3. 자바 플랫폼에는 Java SE(Standard Edition, 기본개발환경), Java EE(Enterprise Edition, 서버기반 프로그램 개발환경), Java ME(Micro Edition, 모바일, 임베디드 시스템 개발환경) 등이 있다.
4. 한국어로 변수를 만들수도 있다.
7. 자바는 int a=1, int b=2;같이 동시 선언 및 초기화가 안된다.
(한줄에 세미콜론(;)이 여러개 있는것은 가능하다.)
int a=1, int b=2; (X) int a = b = 3; (X) int a=1; int b=2; (O) int b; int a = b= 3; (O) int a=3, b=6; (O)
String s1; String s2=s1=new String("haha"); (O) -> 이 경우 new를 써도 가능.
** 위 String의 경우 s2, s1이 같은 객체를 가리키는 것이 된다. 서로 다른 객체로 만들어주려면 따로
new를 써서 만들어줘야 한다. **
8. 변수 선언은 int a; 변수 초기화는 a=3; 변수 선언 및 초기화는 int a=3;이다.
9. public class 이름과 class명은 같아야한다. 예를 들어, hello.java라는 new class를 만들었다면 public class hello{}처럼 같아야한다는 뜻이다.
10. 자바 컴파일러는 javac.exe이다. 명령어는 javac Hello.java이다. 이를통해 바이트코드(Hello.class)가 만들어진다. 실행할 때는 java Hello하면 된다.
11. 자바 아카이브(java archive)는 자바의 여러 파일들을 패키징해서 배포한 것을 말한다. 확장자는 .jar이다. 웹은 .war이다.(스프링부트 하면 나옴)
12. 단점으로는 처리속도가 중요한 프로그램에는 맞지않고, 최근 나오는 프로그래밍 언어에 비해 길고, 예외처리가 필요하다. 하드웨어를 직접 컨트롤할 수 없고, GUI가 많은 프로그램에는 적합하지 않다.
13. 기본적으로 소스코드는 프로젝트 하위의 src 폴더에 위치한다. 이 아래 package로 성격이 비슷한 클래스를 묶어둔다. 특정 패키지의 하위면 코드상에 명시해줄 필요가 있다.(package org.example;같은 느낌으로)
14. main 메소드는 Java application이 제일 먼저 시작하는 메소드이다.( java안의 규약 )
15. 메소드를 정의할 때에는 인스턴스가 존재하지 않는다. 하지만 메소드를 호출할 때에는 인스턴스가 존재하고, this라는 변수에 실제로 접근되는 순간은 메소드가 호출될 때입니다. 정의된 메소드를 호출할 때에 인스턴스를 통해서 호출하기 때문에 이 때에는 이미 생성된 인스턴스를 통해 메소드를 호출한다.
16. 객체지향 언어는 기본적으로 추상화, 상속, 다형성, 캡슐화(정보은닉)의 4가지 특징을 갖는다.
그 외 공통적인 개발 기본 용어