자바 배열 훑기
Java Type Casting
형 변환(Type Casting)이란 한 데이터 타입을 다른 데이터 타입으로 변환하는 과정이다. Java에서는 기본적으로 두 가지 형 변환이 있다.
묵시적 형 변환 (자동 형 변환)
Java는 작은 데이터 타입에서 큰 데이터 타입으로 변환할 때 자동으로 형 변환을 수행한다.
1
2
3
| int num = 10;
double doubleNum = num; // int -> double 자동 변환
System.out.println(doubleNum); // 10.0
|
명시적 형 변환 (강제 형 변환)
큰 데이터 타입에서 작은 데이터 타입으로 변환할 때는 명시적으로 변환해야 한다.
1
2
3
| double doubleNum = 9.78;
int num = (int) doubleNum; // double -> int 강제 변환
System.out.println(num); // 9
|
Java Strings
1
2
3
4
5
6
7
| String s1 = new String("java");
String s2 = new String("java");
System.out.println(s1==s2); // false
String s3 = "java";
String s4 = "java";
System.out.println(s3==s4); // true
|
- new 키워드를 사용하면 항상 새로운 객체를 생성하므로 s1과 s2는 서로 다른 객체이다.
- 문자열 리터럴을 사용하면 같은 문자열을 참조하므로 s3과 s4는 같은 객체이다.
1
2
3
4
5
6
7
8
9
| String s3 = "java";
String s4 = "java";
System.out.println(s3==s4); // true
s3 = "wava";
System.out.println(s3==s4); // false
String s5 = s4.concat(s3); // javawava
// 모든 가공 후에는 인스턴스에 주소값이 생긴다.
|
- 문자열을 변경하면 새로운 객체가 생성되므로 s3과 s4는 다른 객체가 된다.
- 공유의 문제가 생길 수 있으며, s3을 변경하고 싶다면 새로운 객체를 생성하는 것은 시간 복잡도 O(n), 기존 문자열을 재사용하는 것은 O(1)이다.
StringBuffer
시간복잡도 공간복잡도를 낮출 수 있는 방법임
1
2
3
4
5
6
7
8
9
10
11
12
13
| public static void main(String[] args) {
StringBuffer s = new StringBuffer(100);
s.append("java")
// 100칸 짜리 만들거야.
StringBuffer q = new StringBuffer("java");
// default 16칸임
for(int i = 0 ; i < 5 ; i++) {
s.append(i);
System.out.println(s);
}
}
|
StringBuilder & StringBuilder
- 문자열은 불변(immutable)하기 때문에 수정할 때마다 새로운 객체가 생성된다.
- 이를 해결하기 위해 StringBuffer와 StringBuilder를 사용한다.
- 동시성이 일어나지 않는 곳에서만 쓰는거를 지향함.
StringBuffer
- 멀티스레드 환경에서 안전하다 (synchronized).
1
2
3
4
5
6
7
8
| public static void main(String[] args) {
StringBuffer s = new StringBuffer(100);
s.append("java");
for(int i = 0; i < 5; i++) {
s.append(i);
System.out.println(s);
}
}
|
StringBuilder
- StringBuffer와 비슷하지만 동기화가 필요 없는 경우에 사용한다. 속도가 더 빠르다.
1
2
3
4
5
6
7
8
9
10
11
| public static void main(String[] args) {
StringBuilder s = new StringBuilder(100);
s.append("java");
for(int i = 0 ; i < 5 ; i++) {
s.append(i);
System.out.println(s);
System.out.println(s + " "); // stringBuilder, stringBuffer는 가공 메서드를 써야하는 것임 이렇게 쓰는거아님.
System.out.println(s.append(" ")); // append를 사용해야한다.
}
}
|
Java Methods
- methods는 특정 작업을 수행할 때 실행되는 코드 블록
- 코드의 재사용성을 높인다.
💡 메서드 안에 또 다른 메서드를 정의할 수 없음. 클래스 안에 있어야 한다. 💡
1
2
3
4
5
6
7
8
9
10
11
| // OOP
public class MethodTest {
public static void main(String[] args) {
MethodTest m = new MethodTest();
m.a();
}
void a() {
System.out.println("a 호출");
}
}
|
Method Overloading
같은 이름의 메서드를 여러 개 정의할 수 있으며, 매개변수가 다르면 다른 메서드로 인식된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public class MethodTest {
public static void main(String[] args) {
MethodTest m = new MethodTest();
m.print((double)10); // casting
}
void print(int a) {
System.out.println("a 호출");
}
void print(double b) {
System.out.println("b 호출");
}
}
|
static
static 키워드를 사용하면 객체를 생성하지 않고 메서드를 호출할 수 있다.
1
2
3
4
5
6
7
8
9
| public class MethodTest {
public static void main(String[] args) {
a();
}
static void a() { // static : 인스턴스에 객체 생성없이 사용할 수 있다.
System.out.println("a 호출");
}
}
|
- 객체 지향 프로그래밍에서는 객체를 생성하는 것을 권장하므로 static 사용을 최소화해야 한다.
- static 메서드는 가비지 컬렉터의 대상이 되지 않아 메모리에 계속 남아 있을 수 있다.
- 공유 데이터를 만들 때만 static을 사용해야 한다.
Method scope
💡 변수의 유효 범위(Scope)는 변수가 어디에서 접근할 수 있는지를 결정한다.
1
2
3
4
5
6
7
8
| public class Main {
public static void main(String[] args) {
// Code here CANNOT use x
int x = 100;
// Code here can use x
System.out.println(x);
}
}
|
Java Recursion
재귀(Recursion)는 메서드가 자기 자신을 호출하는 기법
Java OOP
재사용 가능한 프로그래밍 기법
클래스와 객체란 ?
클래스: 프로그램 단위 (코드) 객체: 메모리 정보 (수행결과) 즉, 클래스는 객체에 대한 템플릿이고, 객체는 클래스의 인스턴스이다.
encapsulation(캡슐화)
- 캡슐화는 데이터를 보호하는 기법
- private 키워드를 사용하여 직접 접근을 막고 메서드를 통해 접근하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
| class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
접근 제한자
- public : 같은 패키지, 다른 패키지 어디서나 접근 가능
- private : 해당 클래스 내에서만 접근 가능 (외부 접근 불가)
- (default): 같은 패키지에서만 접근 가능, 다른 패키지에서는 접근 불가
- protected : 같은 패키지에서는 접근 가능, 다른 패키지에서는 extends를 통해 자식 클래스에서 접근 가능
inheritance (상속)
- extends 키워드를 사용하여 부모 클래스의 속성과 메서드를 상속받는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| package inheritance;
public class Test {
public static void main(String[] args) {
B b = new B();
b.printI();
}
}
class A {
int i = 10;
public void printI() {
System.out.println(i);
}
}
class B extends A{
int j = 100;
public void printJ() {
System.out.println(j);
}
}
|
polymorphism (다형성)
다음주에 학습할 예정
Array
- 배열이란 ? 동일한 자료형을 가진 여러값을 하나의 변수에 저장하는 객체
- 원소 : 동일한 자료형으로 배열을 구성하는 항목
1
2
3
| String[] cars; // 대괄호로 변수 유형을 정의한다.
String[] cars = {"Volvo", "BMW", "Ford", "Mazda"}; // 값 삽입
int[] myNum = {10, 20, 30, 40};
|
💡 배열 선언에서는 절대로 배열 크기를 표시할 수 없다.💡
배열 선언과 생성
1
2
3
| // 배열 선언과 생성을 하나의 문장으로
int[] month = new int[4]; // month.length = 4
float[] data = new float[7]; // data.length = 7
|
배열 요소에 접근하기
1
2
3
4
5
| String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
System.out.println(cars[0]); // Volvo
cars[0] = "Opel";
System.out.println(cars[0]); // Opel
System.out.println(cars.length); // length : 배열 길이
|
Java Arrays Loop
1
2
3
4
| String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (int i = 0; i < cars.length; i++) {
System.out.println(cars[i]);
}
|
for- each
1
2
3
4
| String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (String i : cars) {
System.out.println(i);
}
|
java 다차원 배열
다차원 배열 : 배열의 배열
- 데이터를 표 형태로 저장하려는 경우 유용하다.
1
2
3
4
| int[][] myNumbers = { {1, 2, 3, 4}, {5, 6, 7} };
System.out.println(myNumbers[1][2]); // 7
myNumbers[1][2] = 9; // 요소 값 변경
System.out.println(myNumbers[1][2]); // 9
|
for-each
1
2
3
4
5
| for (int[] row : myNumbers) {
for (int i : row) {
System.out.println(i);
}
}
|
java Array study
1
2
3
4
5
6
7
8
9
10
11
| class Solution {
public double solution(int[] numbers) {
int sum=0;
double avg=0;
for(int i=0;i<numbers.length;i++){
sum+=numbers[i];
}
avg=(double)sum/numbers.length;
return avg;
}
}
|
1
2
3
4
5
6
7
8
9
10
| class Solution {
public int[] solution(String[] strlist) {
int[] answer = new int[strlist.length];
for(int i=0;i<strlist.length;i++){
answer[i]=strlist[i].length();
}
return answer;
}
}
|