0%

static

메모리 주소 값이 “정적이다”는 뜻입니다. 프로그램 시작 시, 메모리의 위치가 정해지는 것입니다.(어느 패키지에 있던 찾을 수 있습니다.)

static변수와 일반변수 비교

클래스의 멤버변수로 static변수와 일반변수(dynamic)가 있을 경우, 메인에서 사용 시 dynamic변수는 class를 생성해준 후, 사용해야 하지만, static 변수는 메모리의 위치가 이미 정해져있기 때문에, class 를 생성해 주지 않고도, 사용 가능합니다.

1
public class unit {
2
  public static int staticNum;
3
  public int dynamicNum;
4
}
1
// dynamic
2
3
public class main {
4
  public static void main(String[] args){
5
    unit a = new unit(); // class를 생성해 준 후
6
    System.out.println(a.dynamicNum); // 멤버변수 사용가능
7
  }
8
}
1
// static
2
public class main {
3
  public static void main(String[] arges){
4
    System.out.println(unit.staticNum); // class 생성없이, 멤버변수 바로 접근 가능
5
  }
6
}

사용하기 편하지만, 메모리를 어느정도 차지하기 때문에, 너무 많이 사용할 시 메모리 낭비가 심합니다.

class를 여러개 생성해서 사용해도, 한 메모리를 사용하는 것이시 때문에, 각 각 사용할 수 없습니다.

1
public class main {
2
  public static void main(String[] args) {
3
    // unit class 3개 생성
4
    unit a = new unit();
5
    unit b = new unit();
6
    unit c = new unit();
7
    
8
    // 생성된 각각의 static 변수에 각각 다른 값 할당
9
    a.staticNum = 10;
10
    b.staticNum = 20;
11
    c.staticNum = 30;
12
    
13
    // 출력 결과는 모두 같습니다.(같은 메모리를 사용중이기 때문)
14
    System.out.println(a.staticNum);
15
System.out.println(b.staticNum);  System.out.println(c.staticNum);
16
  }
17
}

image

Interface

어떤 규칙을 강제하고 싶은 경우, 규칙을 정의하는 방법 중 하나입니다.

1
ex)
2
interface rule{
3
  public void hello();
4
}

interface를 사용하기 위해서는 사용할 클래스에서 implements 해줘야합니다. implements시, 해당 interface에 있는 메소드는 implements한 클래스에서 재정의 해주어야 합니다.

1
class innerClass implements rule{
2
  @Override
3
  public void hello(){
4
    System.out.println("Hello!");
5
  }
6
}

interface는 다중 implements가 가능합니다.

1
interface rule{
2
  public void hello();
3
}
4
5
interface rule2{
6
  public void goodbye();
7
}
8
9
class innerClass implements rule, rule2{
10
  @Override
11
  public void hello(){
12
    System.out.println("Hello!");
13
  }
14
  
15
  @Override
16
  public void goodbye() {
17
    System.out.println("good bye!");
18
  }
19
}
1
// 전체적인 코드입니다.
2
3
public class main {
4
  public static void main(String[] args) {
5
    innerClass a = new innerClass();
6
    a.hello(); //interface를 implements한 기능
7
    a.goodbye(); //interface를 implements한 기능
8
  }
9
}
10
11
interface rule{
12
  public void hello();
13
}
14
15
interface rule2{
16
  public void goodbye();
17
}
18
19
class innerClass implements rule, rule2{
20
  
21
  @Override
22
  public void hello() {
23
    System.out.println("hello!");
24
  }
25
  
26
  @Override
27
  public void goodbye() {
28
    System.out.println("good bye!")
29
  }
30
}

한 파일에 클래스 여러개를 둘 수도 있습니다.
image

접근권한자

privated

  • 같은 클래스 내에서만 호출 가능. 외부에서 참조하지 못하게 할 때 사용
    1
    private void ac1() {
    2
      System.out.println("private!")
    3
    }

    default

  • 다른 패키지에서 참조 불가
    1
    void ac3() {
    2
      System.out.println("Defalut!");
    3
    }

    protected

  • 다른 패키지에서 참조불가
  • 하지만, 다른 패키지에 있더라도 상속시 사용할 수 있게 해줌
    1
    protected void ac2() {
    2
      System.out.println("Protected!")
    3
    }

public

  • 자유롭게 사용가능
    1
    public void ac4(){
    2
      System.out.println("Public")
    3
    }

image
image

image

image사진참조: [블로그](

Override

자식이 부모클래스를 extends하고 있을 때, 자식 클래스에서 부모클래스가 가지고 있는 메소드를 같은 타입과 같은 이름으로 사용할 경우, 재정의(overriding)한다고 말합니다.

image

image

image

Overload

Overload는 메소드의 이름은 같지만, 인자의 수나, 자료형이 다른 메소드를 중복으로 선언하는 것입니다. 즉, 같은 메소드라고 해도, 매개변수만 다르면 정의하여 사용가능합니다. 메소드의 이름이 같아야 하며, return형은 달라도 상관없습니다. 파라미터의 개수가 달라야하며, 파라미터의 개수가 같은 경우는 데이터 타입이 달라야 합니다.

1
public void ac4() {
2
  //...
3
}
4
public void ac4(String test) {
5
  //...
6
}
7
public void ac4(String test, int testNum){
8
  //...
9
}

쓰레드

쓰레드는 프로세스내에서 작업을 하는 단위로 프로세스는 하나 이상의 쓰레드를 갖고 있습니다.

멀티쓰레드 프로그래밍

선언

1
Runnable 변수이름 = new Runnable(){
2
  @Override
3
  public void run() {
4
    
5
  }
6
};
7
Thread 변수이름 = new Thread(Runnable값);
8
9
// example
10
Runnable todo = new Runnable() {
11
  @Override
12
  public void run() {
13
    
14
  }
15
};
16
Thread thread = new Thread(todo)

Override는 기존에 있는 코드를 재정의하는 것을 말합니다.

Read more »

Java ArrayList / Hashtable

Java에서 자주 사용되는 ArrayList와 Hashtable을 정리하는 포스트

자료구조란?

  • 메모리크기는 한정적이기 때문에 유동적으로 메모리를 할당하고 비효율적인 메모리낭비를 막을 수 있게 해줍니다.

ArrayList

key와 value의 쌍 / key값은 인덱스이고, value값은 실제 값입니다. 이 때 key값은 숫자만 가능하고 기존 배열은 크기를 미리 지정하여, 메모리를 미리 할당받지만, ArrayList는 필요할 때마다 메모리를 할당받아 사용합니다. 배열의 경우 값을 삭제하여도 공간은 남아있지만, ArrayList인 경우 공간도 같이 사라지므로 메모리 낭비를 막을 수 있습니다.

선언

1
import java.util.ArrayList;
2
3
ArrayList<데이터타입> 변수이름 = new ArrayList<데이터타입>();
4
5
ex) ArrayList<String> cafe = new ArrayList<String>();

값 추가

1
ArrayList변수명.add(값);

배열과 달리 미리 메모리공간이 확보되어 있는 것이 아니라, add를 통해 값을 넣을 떄, 메모리가 할당되면서 거기에 값을 사용합니다. 인덱스를 통해 값을 넣어주는 것이 아니라, 자동으로 맨 마지막에 값을 넣어줍니다.

1
cafe.add("americano");
2
// americano를 cafe의 ArrayList에 넣어줍니다.(자동으로 제일 마지막 위치)
3
4
cafe.add(1, "latte")
5
// latte를 1번 인덱스 자리에 넣어줍니다. 1번이 비어있을 경우 2번에 넣을 수 없습니다.
1
// ArrayList의 크기를 가져올때는
2
cafe.size()
3
  
4
// index로 ArrayList의 값 가져오기&지우기
5
cafe.get(1);
6
cafe.remove(1);
7
8
// ArrayList모두 삭제
9
cafe.clear();

Hashtable

key와 value의 쌍. key값을 무조건 숫자로 할 필요 없이, 원하는 값으로 둬도 됩니다.숫자 인덱스가 없으므로, ArrayList처럼 인덱스 값으로 value를 가져올 수 없습니다.

선언

1
import java.util.Hashtable;
2
3
Hashtable<key값의 테이터타입, value값의 데이터타입> 변수이름 = new Hashtable<key값의 데이터타입, value값의 데이터타입>();
4
5
ex) Hashtable<String, String> hash = new Hashtable<String, String>();
6
7
// key값, value값 모두 String인 Hashtable

값추가

1
Hashtable변수명.put(key값, value값);
2
3
ex) hash.put("name", "mett");
4
// hash라는 hashtabledp name이라는 key값과 mett이라는 value값을 넣음
1
// Hashtable의 크기를 가져올때는 .size()를 사용
2
hash.size();
3
4
// Hashtable에서 값 가져오기&지우기
5
hash.get("name");
6
hash.remove("name");
7
8
// Hashtable 모두 삭제
9
hash.clear();

Hashtable에 들어있는 모든 값 출력

Set을 이용합니다. 여기서 Set은 Hashtable의 key값들의 집합으로 사용합니다.

1
Set<String> keys = hash.keyset();

for문을 사용하여 keys Set의 내용들을 하나씩 가져옴

1
for(String key: keys){
2
  System.out.println(key); //keys라는 Set에 들어있는 hash의 key값을 출력
3
  System.out.println(hash.get(key)) // Set에 들어있는 hash의 key값을 이용하여 hash에서 value값을 출력
4
}

클래스 상속

상속

  • 재사용성용이
  • 코드의 양이 줄어듬
  • 유지보수관리용이 (부모만 수정해도 부모기능을 상속하는 자식 객체들의 기능도 수정됨)
  • 부모가 다른 클래스를 상속하고 있는 경우, 자식 클래스도 자동으로 부모가 상속하고 있는 클래스의 기능까지 상속받음

상속 예제

image

image

image

클래스(Class)

객체지향 프로그래밍이란?

객체 지향 언어에서 객체는 데이터나 데이터와 관련된 동작을 모두 포함하는 개념을 말합니다. 따라서 객체 지향 언어는 프로그램을 객체 단위로 나누어서 객체를 중심으로 프로그램을 구성하는 언어입니다.

특징

  • 추상화
    • 실제 세상을 프로그래밍으로 옮길 수 있게, 필요한 기능들만 가져와서 단순화
  • 캡슐화
    • 보안적인 기능에 도움을 줌, 규칙 정의, 사용 용도 명확히. 안에 값을 노출하지 않음
  • 상속성
    • 부모를 지정하고, 부모의 특성들을 가져다 쓸 수 있는것. 코드의 재사용성 용이
  • 다형성
    • 변수가 여러가지 모습으로 변할 수 있는 것
Read more »

배열

하나의 변수이름안에 여러값이 들어가 있는 것입니다. 같은 타입의 변수가 연속적으로 사용될 때 사용됩니다.

image

배열안의 값이 어떤 것이 들어갈지 모르는 경우 배열의 크기만 선언해주는 방법

1
String[] fruits = new Sting [3] //크기가 3인 배열 생성

image

Read more »

Java반복문(while문)

for문이랑 거의 비슷하지만 문법이 살짝 다릅니다.

1
int i=0 // 초기화
2
while(i<10){ // 조건
3
  i++ // i를 1씩 증가
4
}
5
// 위의 while문을 for문으로 바꾼다면
6
for(int i=0; i<10; i++){
7
}

무한루프

1
while(true){
2
  // 구문 무한반복
3
}

for문과 while문의 차이점

for문은 도와주는 변수(i)가 선언 후 for문이 끝나면 사라지는 반면, while문은 문법상 밖에서 선언하기 때문에 도와주는 변수(i)가 사라지지 않습니다. 물론 for문도 밖에서 도와주는 변수를 선언할 경우 for문이 끝나고 사라지지 않습니다.

1
int i =0;
2
for( ; i<10; i++){
3
}

do while문

1
do{
2
  //실행할 구문
3
} while(false); //조건 검사

조건이 false여도 한번은 실행합니다. 실행부터하고 난 후, 조건 검사

다중 while문

구구단

image