Java 객체에 데이터를 저장하는 방법

최종 업데이트 : 2020 년 1 월

스누즈 버튼이 알람 시계에서 가장 일반적으로 사용되는 버튼 일 수 있지만 간단한 AlarmClock클래스 에도 몇 가지 기능이 더 필요합니다. 예를 들어 알람 시계가 스누즈 모드로 유지되는 시간을 제어 할 수 있습니다. 이러한 기능을 추가하려면 Java가 데이터를 제어하는 ​​방법을 이해해야합니다.

개발자 는 Java의 변수 를 사용 하여 데이터를 보유하며 모든 변수에는 데이터 유형과 이름이 있습니다. 데이터 유형은 변수가 보유 할 수있는 값을 결정합니다. 이 자습서에서는 정수 유형이 정수를 보유하고 부동 소수점 유형이 실수를 보유하고 문자열 유형이 문자열을 보유하는 방법을 학습합니다. 그런 다음 Java 클래스에서 인스턴스 변수 사용을 시작합니다.

변수 및 기본 유형

호출 된 기본 유형 , 정수 및 부동 소수점 유형은 Java에서 가장 단순한 데이터 유형입니다. 다음 프로그램은 양수와 음수를 모두 포함 할 수있는 정수 유형을 보여줍니다. 이 프로그램은 코드를 문서화하지만 어떤 식 으로든 프로그램에 영향을주지 않는 주석을 보여줍니다.

/ * * 이것은 또한 주석입니다. 컴파일러는 * 첫 번째 / *부터 주석을 끝내는 "별표 슬래시"까지 모든 것을 무시합니다. * * 주석을 끝내는 "별표"입니다. * / public class IntegerTest {public static void main (String [] args) {// 다음은 anInteger라고하는 int 변수의 선언입니다. // 초기 값은 100입니다. int anInteger = 100; // anInteger 선언 및 초기화 System.out.println (anInteger); // Outputs 100 // 표준 산술 연산자를 사용하여 // 기본 유형으로 산술을 수행 할 수도 있습니다. anInteger = 100 + 100; System.out.println (anInteger); // 출력 200}}

Java는 또한 실수를 보유 할 수있는 부동 소수점 유형 (소수점을 포함하는 숫자를 의미 함)을 사용합니다. 다음은 예제 프로그램입니다.

public class DoubleTest {public static void main (String [] args) {// 다음은 aDouble이라는 double 변수의 선언입니다. // 또한 aDouble에 5.76의 초기 값을 제공합니다. double aDouble = 5.76; // aDouble 선언 및 초기화 System.out.println (aDouble); // Outputs 5.76 // 부동 소수점 유형으로 산술을 수행 할 수도 있습니다. aDouble = 5.76 + 1.45; System.out.println (aDouble); // 7.21 출력}}

위의 프로그램을 실행 해보십시오. 실행하기 전에 컴파일해야합니다.

javac * .java java IntegerTest java DoubleTest 

Java는 아래 표에 표시된 것처럼 4 개의 정수 유형과 2 개의 부동 소수점 유형을 사용합니다. 둘 다 다른 범위의 숫자를 보유하고 다양한 저장 공간을 차지합니다.

일체형

유형 바이트 짧은 Int
SIZE (비트) 8 16 32 64
범위 -128에서 127 -32,768에서 32,767 -2,147,483,648에서 2,147,483,647 -263에서 263-1

부동 소수점 유형 (IEEE 754 형식)

 
유형 단 정밀도 부동 소수점 배정 밀도 부동 소수점
SIZE (비트) 32 64
범위 +/- 1.18x10-38 ~ +/- 3.4x1038 +/- 2.23x10-308 ~ +/- 1.8x10308

문자열 타입은 문자열을 보유하고 있으며 다른 방식의 통합에서 핸들을 부동 소수점 형식 숫자를 처리합니다. Java 언어에는 String문자열을 나타내는 클래스가 포함되어 있습니다. type을 사용하여 문자열을 선언하고 String아래와 같이 큰 따옴표 안에 포함 된 문자 시퀀스 인 따옴표로 묶인 문자열로 초기화합니다. +연산자를 사용하여 두 문자열을 결합 할 수도 있습니다 .

// 코드 조각 // String 유형의 변수 선언, // 따옴표로 묶인 문자열 "Hello"로 초기화. String s = "Hello"; // s의 문자열을 인용 된 문자열과 연결 "World"String t = s + "World"; System.out.println (t); // Hello World 출력

가변 범위

유형 외에도 범위 는 변수의 중요한 특성이기도합니다. 범위는 변수가 생성 및 삭제되는시기와 개발자가 프로그램 내에서 변수에 액세스 할 수있는 위치를 설정합니다. 프로그램에서 변수를 선언하는 위치에 따라 범위가 결정됩니다.

지금까지 메서드 내에서 사용하는 임시 데이터를 보유하는 지역 변수에 대해 설명했습니다 . 메서드 내에서 지역 변수를 선언하고 해당 메서드 내에서만 액세스 할 수 있습니다. 당신은 단지 지역 변수를 검색 할 수이 의미 anInteger당신이 사용 IntegerTest하고, aDouble당신이 사용, DoubleTest그들은 아무데도 선언 된 메인 방법에서를.

모든 메서드 내에서 지역 변수를 선언 할 수 있습니다. 아래 예제 코드는 AlarmClock snooze()메서드 에서 지역 변수를 선언합니다 .

public class AlarmClock {public void snooze () {// 스누즈 시간 (밀리 초) = 5 초 long snoozeInterval = 5000; System.out.println ( "ZZZZZ for :"+ snoozeInterval); }}

선언 snoozeIntervalsnooze()메서드 에서만 얻을 수 있습니다.snoozeInterval, as shown here: 

public class AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); aClock.snooze (); // 여전히 괜찮습니다. // 다음 코드 줄은 ERROR 입니다. // snooze 메서드 외부에서는 snoozeInterval에 액세스 할 수 없습니다. snoozeInterval = 10000; }}

방법 매개 변수

방법 파라미터 로컬 변수 비슷한 범위를 가지며, 가변의 다른 유형이다. 메소드 매개 변수는 메소드에 인수를 전달합니다. 메서드를 선언 할 때 매개 변수 목록에서 인수를 지정합니다. 메서드를 호출 할 때 인수를 전달합니다. 메서드 매개 변수는 연결된 메서드 범위 내에 있고 메서드 전체에서 사용할 수 있다는 점에서 지역 변수와 유사하게 작동합니다. 그러나 지역 변수와 달리 메서드 매개 변수는 메서드를 호출 할 때 호출자로부터 값을 얻습니다. 다음은 snoozeInterval.

public class AlarmClock {public void snooze (long snoozeInterval) {System.out.println ( "ZZZZZ for :"+ snoozeInterval); }}
public class AlarmClockTest {public static void main (String [] args) {AlarmClock aClock = new AlarmClock (); // 메서드를 호출 할 때 스누즈 간격을 전달합니다. aClock.snooze (10000); // 10000 밀리 초 동안 일시 중지합니다. }}

멤버 변수 : 객체가 데이터를 저장하는 방법

지역 변수는 유용하지만 임시 저장소 만 제공하므로 값이 제한됩니다. 수명은 선언 된 메서드의 길이에 걸쳐 있기 때문에 지역 변수는 전화를받을 때마다 표시되지만 전화를 끊으면 사라지는 메모장과 비교됩니다. 이 설정은 메모를 적는 데 유용 할 수 있지만 때로는 더 영구적 인 것이 필요합니다. 프로그래머는 무엇을해야합니까? 멤버 변수를 입력 합니다 .

멤버 변수 (두 개, 인스턴스정적 )는 클래스의 일부를 구성합니다.

가변 범위 및 수명

개발자는 클래스에 유용한 데이터를 포함하기 위해 인스턴스 변수를 구현합니다. 인스턴스 변수는 범위와 수명의 특성상 지역 변수와 다릅니다. 전체 클래스는 선언 된 메서드가 아니라 인스턴스 변수의 범위를 구성합니다. 즉, 개발자는 클래스의 어디에서나 인스턴스 변수에 액세스 할 수 있습니다. 또한 인스턴스 변수의 수명은 클래스의 특정 메서드에 의존하지 않습니다. 즉, 수명은이를 포함하는 인스턴스의 수명입니다.

Instances are the actual objects that you create from the blueprint you design in the class definition. You declare instance variables in the class definition, affecting each instance you create from the blueprint. Each instance contains those instance variables, and data held within the variables can vary from instance to instance.

Consider the AlarmClock class. Passing the snoozeInterval into the snooze() method isn't a great design. Imagine having to type in a snooze interval on your alarm clock each time you fumbled for the snooze button. Instead, just give the whole alarm clock a snoozeInterval. You complete this with an instance variable in the AlarmClock class, as shown below:

public class AlarmClock { // You declare snoozeInterval here. This makes it an instance variable. // You also initialize it here. long m_snoozeInterval = 5000; // Snooze time in millisecond = 5 secs. public void snooze() { // You can still get to m_snoozeInterval in an AlarmClock method // because you are within the scope of the class. System.out.println("ZZZZZ for: " + m_snoozeInterval); } } 

You can access instance variables almost anywhere within the class that declares them. To be technical about it, you declare the instance variable within the class scope, and you can retrieve it from almost anywhere within that scope. Practically speaking, you can access the variable anywhere between the first curly bracket that starts the class and the closing bracket. Since you also declare methods within the class scope, they too can access the instance variables.

You can also access instance variables from outside the class, as long as an instance exists, and you have a variable that references the instance. To retrieve an instance variable through an instance, you use the dot operator together with the instance. That may not be the ideal way to access the variable, but for now, complete it this way for illustrative purposes:

public class AlarmClockTest { public static void main(String[] args) { // Create two clocks. Each has its own m_snoozeInterval AlarmClock aClock1 = new AlarmClock(); AlarmClock aClock2 = new AlarmClock(); // Change aClock2 // You'll soon see that there are much better ways to do this. aClock2.m_snoozeInterval = 10000; aClock1.snooze(); // Snooze with aClock1's interval aClock2.snooze(); // Snooze with aClock2's interval } } 

이 프로그램을 시도해 보면 aClock1여전히 간격이 5,000이고 aClock2간격이 10,000입니다. 다시 말하지만 각 인스턴스에는 자체 인스턴스 데이터가 있습니다.

클래스 정의는 청사진 일 뿐이므로 인스턴스 변수는 청사진에서 인스턴스를 생성 할 때까지 실제로 존재하지 않습니다. 클래스의 각 인스턴스에는 인스턴스 변수의 자체 복사본이 있으며 블루 프린트는 해당 인스턴스 변수가 무엇인지 정의합니다.

자바 월드

캡슐화

Encapsulation is one of the foundations of object-oriented programming. When using encapsulation, the user interacts with the type through the exposed behavior, not directly with the internal implementation. Through encapsulation, you hide the details of a type's implementation. In Java, encapsulation basically translates to this simple guideline: "Don't access your object's data directly; use its methods."

That is an elementary idea, but it eases our lives as programmers. Imagine, for example, that you wanted to instruct a Person object to stand up. Without encapsulation, your commands could go something like this: "Well, I guess you'd need to tighten this muscle here at the front of the leg, loosen this muscle here at the back of the leg. Hmmm -- need to bend at the waist too. Which muscles spark that movement? Need to tighten these, loosen those. Whoops! Forgot the other leg. Darn. Watch it -- don't tip over ..." You get the idea. With encapsulation, you would just need to invoke the standUp() method. Pretty easy, yes?

Some advantages to encapsulation:

  • Abstraction of detail: The user interacts with a type at a higher level. If you use the standUp() method, you no longer need to know all the muscles required to initiate that motion.
  • Isolation from changes: Changes in internal implementation don't affect the users. If a person sprains an ankle, and depends on a cane for a while, the users still invoke only the standUp() method.
  • Correctness: Users can't arbitrarily change the insides of an object. They can only complete what you allow them to do in the methods you write.

Here's a short example in which encapsulation clearly helps in a program's accuracy:

// Bad -- doesn't use encapsulation public class Person { int m_age; } public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.m_age = -5; // Hey -- how can someone be minus 5 years old? } } // Better - uses encapsulation public class Person { int m_age; public void setAge(int age) { // Check to make sure age is greater than 0. I'll talk more about // if statements at another time. if (age > 0) { m_age = age; } } } public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.setAge(-5); // Won't have any effect now. } } 

그 간단한 프로그램조차도 클래스의 내부 데이터에 직접 액세스하면 어떻게 문제에 빠질 수 있는지 보여줍니다. 프로그램이 크고 복잡할수록 캡슐화가 더 중요해집니다. 또한 많은 프로그램이 작게 시작된 다음 무한정 지속되도록 확장되므로 처음부터 올바르게 설계하는 것이 중요합니다. 에 캡슐화를 적용하려면 AlarmClock다시 알림 간격을 조작하는 메서드를 만들면됩니다.

방법에 대한 참고 사항

메서드는 호출자가 사용하는 값을 반환 할 수 있습니다. 값을 반환하려면 void가 아닌 반환 유형을 선언하고 return문을 사용합니다 . getSnoozeInterval()예에 나타낸 방법에 대하여이를 예시한다.

프로그램 작성