Post

[Day10] java 기초2

[Day10] java 기초2

자바 배열 훑기


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;
    }
}
This post is licensed under CC BY 4.0 by the author.