Development/OOP(Java)

Ch5. Defining Classes(2)

일단하고봐 2023. 4. 3. 16:18

Static Methods

: object 없이 호출하여 사용가능한 method

- static method는 class에 속하며 class definition 내부에서 정의된다.

- static method를 정희할 때 static 이라는 keyoword를 사용한다.

   -> pulbic static returnedType myMethod (parameters)

        {...}

- static method는 호출 객체 대신 class 이름을 사용하여 호출한다.

   ex) returnedValue = Myclass.myMethod(arguments);

 

Pitfall : Invoking a Nonstatic Method Withn a Static Method

: 정적 메서드 내에서 비정적 메서드 호출

- 정적 메서드는 클래스의 instance variable을 참조할 수 없으며 클래스의 정적 메서드를 호출할 수 없다.

- 정적 메서드에는 this 값이 존재하지 않기 때문에 호출 객체에 대한 암시적,명시적 instance variable 혹은 메서드 사용이 불가하다.

- 다른 정적 메서드를 호출하는 것은 가능하다.

같은 Class 내부이므로 class name 생략하고 사용 가능
객체를 생성하고 method를 사용하는 경우

Static Variables

- static variables는 하나의 객체만이 아니라 클래스 전체에 속하는 변수이다.

   -> 각 객체가 하나의 복사본을 갖는 instance variable과 달리 클래스당 정적 변수의 복사본은 하나이다.

- 클래스의 모든 객체가 static variables를 읽고 쓸 수 있다.

- static methods는 instance variable에는 접근 불가하지만 static variables에는 접근가능하다.

- static variables는 instance variable처럼 선언되며 static 을 사용하여 선언한다.

   ex) private static int myStaticVariable;

- 정적 변수는 선언과 초기화를 동시에 수행 가능하다. 

   ex) private static int myStaticVariable = 0;

- 명시적으로 초기화되지 않은 경우 자동으로 초기화된다. (초기화 해주는 것이 이상적)

   -> boolean type : false, primitive types : 0, class type : null

- 정적 변수는 상수가 아닌 경우 항상 private으로 정의되어야 한다.

    -> 정적으로 정의된 상수의 경우 변경불가하므로 public으로 사용 가능하다.

    -> 해당 값이 변경불가함을 표현하기 위해 final 수식어를 사용해야 한다.

          ex) public static final int BIRTH_YEAR = 1954;

- 클래스 외부에서 상수를 참조하는 경우 클래스명을 사용하여 호출한다.

    ex) int year = MyClass.BIRTH_YEAR;

 

The Math class

: Math 클래스는 많은 수학적 methods를 제공

- java.lang 패키지에 포함되어있어 자동으로 import 되어 사용 가능하다. 

- 모든 methods와 data는 static으로 Math 클래스명과 함께 호출된다.

- Math 클래스는 E, PI 두가지 정의된 상수를 갖는다.

 

Math 클래스의 Methods

1. public static double pow (double base, double exponent)

-> 제곱을 연산

ex) Math.pow (2.0, 3.0) => 8.0

 

2. public static double abs(double argument)

public static float abs(float argument)

public static long abs(long argument)

public static int abs(int argument)

-> 해당 type 의 값의 절댓값을 return

ex) Math.abs(-6) => 6

 

3. public static double min(double n1, double n2)

public static float min(float n1, double n2)

public static long min(long n1, double n2)

public static int min(int n1, double n2)

-> 인자로 받은 값 중 최소값을 return

ex) Math.min(3, 2) => 2

 

4.  public static double max(double n1, double n2)

public static float max(float n1, double n2)

public static long max(long n1, double n2)

public static int max(int n1, double n2)

-> 인자로 받은 값 중 최댓값을 return

ex) Math.max(3, 2) => 3

 

5. public static long round(double argument)

public statci int round(float argument)

-> 인자로 받은 값을 반올림 연산하여 return

ex) Math.round(3.2) => 3 , Math.round(3.6) => 4

 

6. public statci double ceil(double argument)

-> 인자로 받은 값을 올림 연산하여 return

ex) Math.ceil(3.2) => 4.0, Math.ceil(3.6) => 4.0

 

7. public static double floor(double argument)

-> 인자로 받은 값을 내림 연산하여 return

ex) Math.floor(3.2) => 3.0 , Math.floor(3.9) => 3.0

 

8. public static double sqrt(double argument)

-> 인자로 받은 값의 제곱근을 연산하여 return

ex) Math.sqrt(4) => 2.0

 

Random Numbers

: Math 클래스는 난수를 생성하는 기능을 제공한다.

  public static double random()

  *Random 클래스는 flexible 한 난수값을 생성한다.

ex) double num = Math.random();

 

Wrapper class

: 기본 데이터 타입을 객체로 감싸는 클래스

primitive types : byte, short, int, long, float, double, char -> Byte, Short, Integer, Long, Float, Double, Character

- Wrapper class는 정의된 상수나 static methods를 포함한다.

 

Wrapper class 사용 이유

  1. 객체 형태로 데이터를 다룰 있다.
  2. 객체로 감싸지 않으면 기본 데이터 타입은 null 값을 가질 없다. 하지만 객체로 감싸면 null 값을 가질 있다.
  3. 객체로 감싸면 다양한 메소드를 사용할 있다.

Boxing

: 기본 데이터 타입을 Wrapper class의 객체로 변환하는 것

- 새로운 객체에는 원시 값의 복사본을 저장하는 instance variable을 포함

- 다른 클래스와 다르게 wrapper class는 인자 없는 생성자를 갖지 않는다.

ex) Integer integerObject = new Integer(42);

 

Unboxing

: Wrapper class의 객체를 기본 데이터 타입으로 변환하는 것

ex) int i = integerObject.intValue( );.  ->   인자를 갖지 않음

 

Automatic Boxing and Unboxing

- java 5.0 이후로는 자동으로 boxing , unboxing이 가능하다.

- 이전 설명처럼 new를 사용하여 객체를 생성하는 것이 아니라 자동으로 생성한다.

   ex) Integer integerObejct = 42;

-  wrapper 클래스 객체에서 원시 데이터 유형으로 변환하는 경우

   ex) int i  = integerObject;

 

Constants and Static Methods in Wrapper Classes

-Wrapper 클래스는 최댓값,최솟값을 제공하는 상수를 제공한다.

  ex) Integer.MAX_VALUE, Integer.MIN_VALUE, Double.MAX_VALUE, Double.MIN_VALUE

- Boolean 클래스는 두 상수에 대한 이름이 존재

  ex) Boolean.TRUE, Boolean.FALSE

- Wrapper 클래스는 문자열 표현의 숫자를 변환하는 정적 메서드를 포함한다.

   ex) Integer.parseInt, Long.parseLong

- Wrapper 클래스는 숫자값을 문자열 표현으로 변환하는 정적 메서드를 포함한다.

   ex) Double.toString(123.99); -> return "123.99"

- Character class에는 문자열 처리에 유용한 정적 메서드가 포함되어있다.

 

Character Class의 Methods

1. toUpperCase()

public static char toUpperCase(char argument)

-> 대문자로 변환, 문자가 아닌 경우 변화없음

ex) Character.toUpperCase('a') => return 'A'

 

2. toLowerCase()

public static char toLowerCase(char argument)

-> 소문자로 변환, 문자가 아닌 경우 변화없음

ex) Character.toLowerCase('A') => return 'a'

 

3. isUpperCase()

public static boolean isUpperCase(char argument)

-> 대문자인 경우 true 반환, 아닌 경우 false

ex) Character.isUpperCase('A') = > return true

 

4. isLowerCase()

public static boolean isLowerCase(char argument)

-> 소문자인 경우 true 반환, 아닌 경우 false

ex) Character.isLowerCase('a') => return false

 

5. isWhitespace()

publci static boolean isWhitespace(char argument)

-> 공백인 경우 true 반환 (빈칸, \t, \n  세 가지 경우에 해당)

ex) Character.isWhitespace(' ') => return true

 

6. isLetter()

public static boolean isLetter(char argument)

-> 인자가 문자인 경우 true 반환

ex) Character.isLetter('A') => return true, Character.isLetter('5') => return false

 

7. isDigit()

public static boolean isDigit(char argument)

-> 인자가 정수인 경우 true 반환

ex) Character.isDigit('5') => return true

 

8. isLetterOrDigit()

public static boolean isLetterOrDigit(char argument)

-> 인자가 문자거나 정수인 경우 true 반환

ex) Character.isLetterOrDigit('A') => true, Character.isLetterOrDigit('5') => true

 

Variables and memory

대부분의 데이터 유형의 값을 1byte 이상의 저장공간을 필요로한다.

- 여러개의 인접 바이트가 데이터를 유지하는데 사용됨

- 데이터를 저장하는 전체 덩어리를 memory location 이라고 한다.

- memory location의 첫번째 주소를 데이터의 주소로 사용한다.

 

main memory는 다양한 크기의 memory location의 list로 생각 할 수 있다.

 

Reference

- 모든 변수는 memory location에서 실행된다.

- 변수가 primitive type인 경우 변수의 값은 할당된 memory location에 저장된다. -> primitive type은 일정 양의 메모리를 필요로 함 

- 변수가 class type 인 경우, 객체가 위치한 메모리 주소만 할당된 memory location에 저장

   => primitive type 과 달리 클래스 변수 값은 memory address 혹은 reference 이다.

- 두 참조 변수는 같은 객체를 가리킬 수 있다.

   variable2 = variable1; => 같은 객체를 가리킨다.  

 

variable1, variable2 가 같은 객체에 대한 주소를 갖고 있다.

 

같은 객체를 참조하므로 객체가 변하면 variable1,variable2 모두 같은 값을 가리킨다.