[TIL] 220928 - 자바 기초(2) : 연산자, 배열, 함수

yujamint·2022년 9월 29일
0

TIL

목록 보기
5/9

연산자

논리 연산자

  • 논리 곱(&&) : 두 항의 결과가 모두 true일 때만 결과가 true
  • 논리 합( || ) : 두 항의 결과가 모두 false일 때만 결과가 false

단락 회로 평가 : 앞 항의 결과만 평과하고도 연산자의 결과를 알 수 있을 떄, 뒤 항의 결과를 평가하지 않는다.

  • 1 > 3 && 2 > 4 : 논리 곱 연산자의 경우, 두 항의 결과가 모두 true일 때 true를 return 한다. 하지만, 앞 항(1 > 3)의 결과가 false이기 때문에 뒤 항의 결과를 평가하지 않고도 연산자의 결과가 false라는 것을 알 수 있다. 그러므로, 뒤 항의 결과는 평가하지 않는다.

조건 연산자

  • 삼항 연산자
  • if (조건문)를 간단히 표현할 때 사용할 수 있다.

조건식 ? 결과1 : 결과2 조건식이 참이면 결과1, 거짓이면 결과2를 선택한다.

배열

int 배열 생성시, 모든 인덱스 0으로 초기화

  • double 배열 : 0.0
  • boolean 배열 : false
  • char 배열 : \0
  • String 배열 : null

배열에 값을 넣으면서 생성하고 싶을 때는?

int[] scores = {90, 80, 77, 100, 95};

원소가 원시타입(int)인 경우 : 값을 그대로 저장하며, 메모리 크기가 4Byte로 고정되어 있다.

원소가 참조타입(String과 같은 객체)인 경우 : 값이 그대로 저장하는 것이 아니라, 객체의 주소를 저장한다.

  • 64bit 체제에서는 하나의 주소를 저장하는 데에 8Byte를 사용한다.
    • 32bit 체제에서는 4Byte
  • openjdk의 VM을 사용해서 주소값에 직접 접근할 수 있다.
    • JVM이 알아서 해주는 부분이기 때문에 굳이 관여할 필요는 없다!

이차원 배열

행과 열을 가진 테이블 형태

사실상 이차원 배열이라는 개념은 물리적으로 존재하지 않는다.

→ 일차원 배열을 여러개 저장하는 배열이다.

이차원 배열 선언

데이터타입[][] 배열변수이름 = new 데이터타입[행의 크기][열의 크기];

열의 개수를 n개로 선언했다면, 모든 행의 열 개수가 n개로 고정되어있다.

== 첫 번째 행은 n개의 열을 가지고, 두 번째 행은 n-3개의 열을 가질 수 없다.

int[][] new scores = new int[ROW_NUM][COL_NUM];

위와 같이 scores라는 2차원 배열을 선언했을 때, scores[i].length() == COL_NUM이다.

  • 행의 길이 : scores.length()
  • 열의 길이 : scores[i].length() // 열의 길이는 모든 행이 같은 길이를 가진다.

배열 변수에는 첫번째 원소 주소만 저장된다.

첫번째 원소의 주소에서 인덱싱을 통해서 배열 내의 다른 원소에 접근 가능

  • i+1번째 원소 : i번째 원소의 주소 + 4Byte

Row-major order vs Column-major order

자바의 경우에는 행 단위로 저장하는 row-major order를 따르고 있다. (정확하게 row-major는 아니지만, row-major의 형태로 저장되고 있다.)

  • 첫번째의 원소의 주소 저장, 순차적으로 주소 증가하며 다음 열의 원소 저장

열 단위로 데이터에 접근하는 것이 유리한 경우도 있다.

배열 복사

원소를 복사하는 것이 아니라, 주소가 복사되는 것을 주의해야 된다.

얕은 복사(Shallow Copy) : 주소가 복사되는 것.

깊은 복사(Deep Copy) : 원소가 복사되는 것.

참고 : https://velog.io/@db_jam/Java-얕은-복사Shallow-Copy와-깊은-복사Deep-Copy

열거형 (enum)

정해져 있는 부서, 직급 등의 경우 상수값으로 만들어 클래스처럼 사용 가능하다.

public enum Department {
	ADMIN("경영관리부서"), DEVELOP("개발부서"), RESEARCH("연구부서");
}

함수

함수는 반환값을 가질 수 있는데, 반환값은 하나이거나 없다.

  • 반환값이 없다면 void
  • 2개 이상 반환하고 싶다면 객체나 배열로 묶어야 한다.

오버로딩

public static int a() {
}
public static int a(int x, int y) {
}

중복정의 - 함수의 이름은 같으나 매개변수에 따라 다른 함수가 호출되는 성질

  • 매개변수 개수, 순서, 타입을 통해 구분한다.
  • 반환값을 통해 구분되진 않는다.

보통 생성자에 오버로딩을 많이 한다.

가변인자

public static void main(String... args)

String 인자의 개수를 정해놓지 않고 받는다.

→ 인자의 개수를 알지 못할 때, 가변인자로 정의할 수 있다.

컴파일시에는 배열로 바뀌어 연산한다.

Call by reference vs Call by value

  • call by reference : 참조자를 통해 호출
    • 참조자라는 개념은 C++에만 존재한다.
      • 참조자는 변수의 별명과 같다
      • int& a = b; // a,b는 동일한 변수
    • reference == address라고 생각하곤 하지만, 아니다
  • call by value
    • value가 원시 타입일 때와 참조 타입일 때로 나뉜다.
    • 참조 타입의 경우에는 변수가 address를 가지고 있다.
    • 즉, call by address가 call by value에 속해있는 것이고, call by reference가 아니다!!!
      • call by value에서 value가 참조 타입인 것

함수의 파라미터로 주소값을 전달하면 해당 함수를 통해서 원본의 값을 변경할 수 있다. (call by address)

profile
개발 기록

0개의 댓글