본문 바로가기

JAVA 기본

[백기선 강사님] 3주차 과제

  • 산술 연산자

    * 일반적인 수식에 사용되는 연산자
    +, -, *, / , % 가 존재한다.
    + : 덧셈 연산자
    - : 뺄셈 연산자
    * : 곱셈 연산자
    / : 나눗셈 연산자
    % : 나머지 연산자

    컴퓨터에서 연산 할 수 있는 방식은 + (가산기) 만 존재한다. 따라서 다른 연산자를 수행할 때, 덧셈을 반복해서 수행한다.

    - 의 경우는 + 연산을 수행하는데, -의 경우 2의 보수를 통해 계산한다.

    2의 보수는 2진 데이터를 역을 취하고, 1을 더하는 식의 형식을 하게된다.

    2의 보수의 경우, 0을 표기하는 방법이 1가지로 중복되지 않아 현재 사용하는 음수표현을 가장 낭비없이 하는 표현이다.

    따라서 3-2 라고 가정한다면, 3-2 = 1 이 나오고, 3+(-2) = 1 이 된다. 3은 0011 이고, -2는 1110 으로 덧셈 시, 10001으로 비트가 4비트가 넘어가고, 첫 비트를 버림하여 값을 보게되면 0001이 된다. 즉 1이라는 숫자가 나온다.

    컴퓨터는 * 의 경우는 덧셈을 반복하여 수행하는 작업이며, / 의 경우 뺄셈을 반복하여 수행한다.

    %의 경우 뺄셈을 하고 남는 값을 반환해주는 식으로 0이 아닌 수가 나오는 경우 그 값을 반환해주는 것이 아닌가 싶다. [자료 못 찾]

    결 : 자바에서 그냥 아무생각없이 써도 된다. 속도적인 측면을 생각하면 << 써야지.. shift register가 있는데
  • 비트 연산자

    비트를 연산하는 연산자

    & : [AND] , | : [OR] , ~[not] , ^[XOR], << [shift] , >>[shift], >>> 

    shift 는 << 의 경우 비트를 x비트 왼쪽으로 이동시킨다. >> 의 경우 오른쪽으로 이동
    shift의 경우 << [숫자] 인데, 해당 숫자만큼 비트를 이동시킨다. 
    >>>  의 경우 최상위 비트 부호비트를 신경쓰지 않는 shift 연산이다. [ 이건 부호도 옆으로 옴긴다. <<< 는 없어? ]
    shift 연산의 경우 long 만 제외하고 byte,short,char 는 int로 변환 된다고 한다.

  • 논리 연산표 [ 비트연산을 표현하는데 있어 가장 좋은건 논리 연산표 ]

  1. AND 의 경우 같은 비트면 1
  2. OR 의 경우 비트 중 한개라도 1이면 1
  3. XOR 은 비트가 다르면 1
  4. NAND 의 경우 자바에는 존재하지 않는다. 의도적으로 만들어보자
    NAND는 두개가 다 1이면 0, 나머지 1.

    그럼, 어떻게 만들 수 있는가? ~(a&b) 으로 만들 수 있을 것이다.
    해당 부분은 결국 연산자의 합으로 이루어진다.
  5. NOR 또한 존재하지 않는다. 의도적으로 만들어보자
    NOR은 둘다 0이면 1이다.
    해당 부분은 결국 ~(a|b) 라고 표현이 가능하며, 연산자를 똑같이 이용할 수 있다.
  • 논리 연산자

    위의 비트 연산자는 비트를 연산하는거고, 그럼 논리 연산자는 무엇인가?
    논리 연산자는 true 와 false 의 관계를 연산하는 연산자다.
    true, false 로 표현된다. 이게 관계 연산자, 비트 연산자와 다른 점이다.

    연산자 종류

    && : AND
    - AND 는 두 값이 TRUE로 동일할때 TRUE 가 떨어진다. 사실상, 비트 연산이라고 봐도 무방할 거 같다. 
    - 이유 : true & true
    [ true 는 1 false 는 0 으로 표현한다 대체로... / c언어에서 if는 0이 아니면 다 true 로 떨어진다 이건 어떻게 해야되는가? ]
    || : OR
    - OR 는 둘 중 하나라도 true 이면 true 가 떨어진다. [ true | false ] = true !
    ! : NOT
    - NOT 은 연산자가 다른데, 반전이란건 동일하다. ~true = false , ~false = true

  • 즉 결론은 논리연산과 동일한 방식이나, 그 결과값을 true 와 false 를 이용하다는게 있다.
  • 관계 연산자

    관계 연산자는 두 수의 관계 즉, 대소 등 관계를 비교한다.
    따라서 2수를 우선적으로 연산하고 비교하는 식은 불가능하다.
    이유는 반환값이 TRUE, FALSE 이기 때문이다.
    [ 결국 연산자들을 소괄호로 묶어서 처리하는게 중요하다. ]

    관계 연산자 표를 확인하고 해당 이용을 잘 사용해봅시다.

출처 : http://brickbotblog.blogspot.com/2015/09/c_66.html

  • assignment(=) operator

    대입 연산자 인데, 해당 대입 연산자는 가장 많이 사용된다. 생성해서 넣기도 하며, 또는 덧셈 뺄셈 등 기본적인 산술연산, shift 등을 단축하여 사용하는데 사용된다.

    단축해서 사용하기는 좋으나, 조심스럽게 사용하는것을 권장한다. 유지보수 관점에서 봤을때는 별로인것 같다..

ㅈ출처 : https://opentutorials.org/module/3921/23776

  • 증감 연산자

    ++ , --  말 그대로 증가시키고, 감소 시키는 연산자다.
    증가 : 1을 증가시킨다.
    감소 : 1을 감소시킨다.

    ** 주의 사항

    증감 연산자는 앞, 뒤의 연산자 위치에 따라 다른 결과를 부른다.
    어떤 코드에서 증가연산자가 앞에 붙으면 1을 증가시키고, 작업을 수행하고, 뒤에 붙으면 작업을 수행하고, 1을 증가시킨다.

    감소 연산자도 마찬가지다.

    해당 부분은 여러 시행착오를 겪으면서 몸소 겪는게 좋다.

3항 연산자

3항 연산자는 특이한 연산자 라고 봐도 좋다.
if 문은 블럭 안에서 리턴을 해주는 값이 없는 로직이 들어간다.
예를 들어

if ( true ){
	로직	
} else {
	로직
}

if 를 제외한 로직

위와 같은 로직에서 if 안에서 어떤 변수에 한개의 값을 넣는다고 해보자.

String a;

if(true){
	a = "if문"
}else{
	a = "else문"
}

위와 같이 사용이 가능할 것이다.
단지 a 에 값을 넣는 것 뿐인데, 해당 부분을 코드로 표현하자면 5줄의 코드로 나온다.

 

삼항 연산자의 문법은 다음과 같다

( [ 조건식 ] ) ? [true 일때의 반환 값 / 로직<-반환값이 있는.. ] : [ false 일때의 반환값 / 로직 <- 반환값이 있는 ];

결국 삼항 연산자를 왜 쓰냐? 라고 묻는다면, 코드가 간결해지며, 삼항 연산자는 반환이 가능하다! 라고 보면 된다.

IF 와 삼항 연산자는 결국 반환 값이 있는 연산자 라고 봐야 한다.

 

삼항 연산자는 삼항 연산자 안에서도 사용이 가능한데, 사실 삼항연산자가 난무하는 코드는 유지보수가 매우 힘들다 쓰지말자 왠만해선.. 진짜 2개로 끝난다 싶으면 쓰자 좋지 않다고 생각한다.
[ 왜 쓸까 생각해보면 예전엔 메모리가 모잘랐으며, 해당 부분이 code 자체가 다 메모리에 올라가면서 메모리가 부족하다고 느껴 한줄에 끝내는 과정을 한거 아닌가 싶다. 이건 좀.. 생각해보자 , 왠만하면 if 쓰면서 유지보수도 좋고, 증가하는데도 부족함이 없이 가자 ]

  • 연산자 우선 순위
    ** 다른 연산자 우선순위 제외하고 보자.. 위의 연산자만 감안했을때 
    1) 증감 연산자
    2) 산술 연산자 -> 특이사항 : 산술연산자보다, NOT 연산이 빠름
    3) 관계 연산자
    4) 논리 연산자
    5) 삼항 연산자
    6) 대입 연산자

**** 자... 이제부터 자바에서 특수하게 사용되는 연산자 이 위는 전부 C, C++, JAVA, python 등 모두 사용되는 연산자 **

 

  • instanceof

  • 화살표(->) 연산자

 

 

 

'JAVA 기본' 카테고리의 다른 글

자바 2주차 스터디 [ 백기선 강사님 ]  (0) 2021.02.04