2.2 Μετατροπή τύπων (type casting) στη Java

Η μετατροπή τύπων (type casting) στη Java αναφέρεται στη διαδικασία της αλλαγής του τύπου δεδομένων μιας τιμής από έναν αρχικό πρωτεύοντα τύπο σε έναν διαφορετικό τύπο.

Στη Java, υπάρχουν δύο είδη μετατροπής τύπων:

  1. Αυτόματη μετατροπή (Widening Casting): Αυτό είναι το είδος μετατροπής που γίνεται αυτόματα από τη γλώσσα Java όταν μετατρέπουμε μια τιμή από έναν μικρότερο τύπο σε έναν μεγαλύτερο τύπο δεδομένων. Αυτή η μετατροπή δεν προκαλεί απώλεια δεδομένων.
    Η σειρά των τύπων για την αυτόματη μετατροπή είναι: byte -> short -> char -> int -> long -> float -> double
  2. Χειροκίνητη μετατροπή (Narrowing Casting): Αυτό είναι το είδος μετατροπής που πραγματοποιείται όταν μετατρέπουμε μια τιμή από έναν μεγαλύτερο τύπο σε έναν μικρότερο τύπο δεδομένων. Αυτή η μετατροπή μπορεί να προκαλέσει απώλεια δεδομένων, καθώς η τιμή μπορεί να υπερβαίνει το εύρος του νέου τύπου.
    Η σειρά των τύπων για τη χειροκίνητη μετατροπή είναι: double -> float -> long -> int -> char -> short -> byte

Για τη χειροκίνητη μετατροπή τύπων δεδομένων, ο προγραμματιστής πρέπει να χρησιμοποιήσει τη σύνταξη για να δηλώσει τον επιθυμητό τύπο δεδομένων. Οι μετατροπές αυτές πρέπει να γίνονται με προσοχή, καθώς μπορεί να προκύψουν προβλήματα με την ακρίβεια και το μέγεθος του αντικειμένου του τύπου δεδομένων.

Ένα παράδειγμα αυτόματης μετατροπής είναι η ανάθεση ενός ακέραιου αριθμού σε έναν διπλό (double). Η Java θα εκτελέσει αυτόματα τη μετατροπή, εφόσον η διπλή ακρίβεια είναι μεγαλύτερη από την ακέραια ακρίβεια.

Ένα παράδειγμα χειροκίνητης μετατροπής είναι η μετατροπή ενός double σε ένα int. Σε αυτήν την περίπτωση, πρέπει να χρησιμοποιηθεί η συντακτική δομή για να δηλωθεί ο επιθυμητός τύπος δεδομένων και να αναθεθεί η τιμή σε αυτόν τον τύπο δεδομένων:

double myDouble = 3.14159;  // Δημιουργία μεταβλητής τύπου double με τιμή 3.14159
int myInt = (int) myDouble;  // Μετατροπή της μεταβλητής myDouble σε τύπο int και αποθήκευση του αποτελέσματος στη μεταβλητή myInt

Στον παραπάνω κώδικα πραγματοποιούνται οι εξής ενέργειες:

  1. Δημιουργείται μια μεταβλητή myDouble τύπου double με την τιμή 3.14159. Ο τύπος double αναπαριστά έναν αριθμό με κινητή υποδιαστολή, που σημαίνει ότι μπορεί να περιέχει δεκαδικούς αριθμούς.
  2. Στη συνέχεια, υπάρχει η γραμμή κώδικα int myInt = (int) myDouble;. Αυτή η γραμμή πραγματοποιεί μια μετατροπή της μεταβλητής myDouble από τύπο double σε τύπο int. Η μετατροπή γίνεται με τη χρήση της τελεστή τύπου (int) και ονομάζεται “casting”. Κατόπιν, το αποτέλεσμα της μετατροπής αποθηκεύεται στη μεταβλητή myInt, η οποία είναι τύπου int.

Συνολικά, ο κώδικας αυτός δημιουργεί μια μεταβλητή myDouble με τιμή 3.14159 και μετατρέπει την τιμή αυτή σε τύπο int, αποθηκεύοντας το αποτέλεσμα στη μεταβλητή myInt. Ωστόσο, επειδή η μετατροπή από double σε int απορρίπτει το μέρος των δεκαδικών ψηφίων, η τιμή που αποθηκεύεται στη μεταβλητή myInt θα είναι 3.

[adinserter block=”2″]

Είναι σημαντικό να έχετε υπόψη ότι η χειροκίνητη μετατροπή των τύπων μπορεί να οδηγήσει σε απώλεια ακρίβειας και στρογγυλοποίηση των δεδομένων. Επομένως, πρέπει να τη χρησιμοποιείτε με προσοχή και να επαληθεύετε ότι η μετατροπή γίνεται σωστά και δεν επηρεάζει τη λειτουργικότητα του προγράμματος.

Ένα άλλο παράδειγμα χειροκίνητης μετατροπής είναι η μετατροπή ενός ακεραίου (int) σε ένα byte. Σε αυτήν την περίπτωση, πρέπει να λάβετε υπόψη ότι η διαθέσιμη χωρητικότητα του byte είναι μικρότερη από αυτήν του int, με αποτέλεσμα να υπάρχει πιθανότητα απώλειας δεδομένων. Συνεπώς, πρέπει να είστε ιδιαίτερα προσεκτικοί όταν χρησιμοποιείτε αυτόν τον τύπο μετατροπής.

int myInt = 1065; // Δημιουργία μιας μεταβλητής τύπου int με τιμή 1065
byte myByte = (byte) myInt; // Μετατροπή της μεταβλητής myInt σε τύπο byte

Στον παραπάνω κώδικα, ορίζεται μια μεταβλητή myInt τύπου int με τιμή 1065. Στη συνέχεια, γίνεται μια μετατροπή της μεταβλητής myInt σε τύπο byte με τη χρήση της (byte) casting.

Η γραμμή κώδικα (byte) myInt εκτελεί το casting της μεταβλητής myInt από int σε byte. Το casting χρησιμοποιείται για να μετατρέψει μια μεταβλητή από έναν τύπο δεδομένων σε έναν άλλο. Σε αυτήν την περίπτωση, η τιμή της μεταβλητής myInt (1065) χωράει μέσα σε ένα byte (καθώς το byte μπορεί να αποθηκεύσει τιμές από -128 έως 127). Ωστόσο, είναι σημαντικό να σημειωθεί ότι μετά το casting, η μεταβλητή myByte θα περιέχει την τιμή -119, αφού υπερβαίνει το μέγιστο θετικό όριο του byte και ξεκινά από την αρνητική πλευρά του εύρους του byte.

Όταν περνάμε έναν τύπο μικρότερου μεγέθους σε έναν τύπο μεγαλύτερου μεγέθους, συμβαίνει αυτόματα μια ευρεία μετατροπή. Αυτό συμβαίνει διότι ο τύπος μεγαλύτερου μεγέθους έχει μεγαλύτερη χωρητικότητα από τον μικρότερο τύπο, επιτρέποντάς του να χωρέσει την τιμή του μικρότερου τύπου δεδομένων.

Αυτή η ευρεία μετατροπή γίνεται αυτόματα από τον μεταγλωττιστή και δεν απαιτεί ειδικές εντολές από τον προγραμματιστή. Ωστόσο, είναι σημαντικό να γνωρίζει ο προγραμματιστής τις διαφορές στη χωρητικότητα των τύπων δεδομένων και να λαμβάνει υπόψη του τυχόν απώλεια ακρίβειας ή περικοπή δεδομένων που μπορεί να συμβεί κατά την ευρεία μετατροπή.

Αυτό σημαίνει ότι δεν χρειάζεται να χρησιμοποιήσετε ειδικό κώδικα για να εκτελέσετε αυτήν τη μετατροπή, καθώς το Java το εκτελεί αυτόματα.

Παραδείγματα ευρείας μετατροπής:

int myInt = 5; // Δημιουργία μιας μεταβλητής τύπου int με τιμή 5
long myLong = myInt; // Ανάθεση της τιμής της μεταβλητής myInt στη μεταβλητή myLong

Ο παραπάνω κώδικας δημιουργεί δύο μεταβλητές, myInt και myLong, και τους αναθέτει την τιμή 5. Είναι σημαντικό να σημειωθεί ότι η myInt είναι τύπου int, ενώ η myLong είναι τύπου long.

Η δεύτερη γραμμή του κώδικα, long myLong = myInt;, αντιγράφει την τιμή της μεταβλητής myInt στη μεταβλητή myLong. Αυτή η ανάθεση γίνεται αυτόματα από την Java, καθώς ο τύπος δεδομένων long είναι μεγαλύτερος από τον τύπο int. Η Java μετατρέπει την τιμή του myInt σε τύπο long πριν την ανάθεση.

Συνολικά, αυτός ο κώδικας δημιουργεί δύο μεταβλητές και αντιγράφει την τιμή μιας από αυτές στην άλλη, μετατρέποντας την τιμή στον κατάλληλο τύπο δεδομένων.

Επίσης, μπορείτε να πραγματοποιήσετε μια ευρεία μετατροπή (widening conversion) όταν περνάτε μια μεταβλητή από μια μέθοδο που επιστρέφει έναν τύπο μικρότερου μεγέθους σε έναν τύπο μεγαλύτερου μεγέθους.

Η ευρεία μετατροπή συμβαίνει όταν ο τύπος δεδομένων της μεταβλητής προορίζεται να “χωρέσει” την τιμή του μικρότερου τύπου. Για παράδειγμα, αν έχουμε μια μέθοδο που επιστρέφει έναν ακέραιο τύπου int και θέλουμε να αποθηκεύσουμε την επιστρεφόμενη τιμή σε μια μεταβλητή τύπου long (μεγαλύτερου μεγέθους), μπορούμε να το κάνουμε χωρίς προβλήματα.

// Δηλώνεται μια μεταβλητή τύπου double με την τιμή 3.14
double myDouble = 3.14;

// Δηλώνεται μια μεταβλητή τύπου int και γίνεται ο μετατροπή της myDouble σε int
int myInt = (int) myDouble;

Στον παραπάνω κώδικα, χρησιμοποιούνται δύο μεταβλητές. Ας προσθέσουμε σχόλια για να εξηγήσουμε κάθε γραμμή:

  1. Η γραμμή double myDouble = 3.14; δηλώνει μια μεταβλητή myDouble τύπου double και την αρχικοποιεί με την τιμή 3.14. Ο τύπος double αναπαριστά έναν αριθμό με δεκαδικά ψηφία.
  2. Η γραμμή int myInt = (int) myDouble; δηλώνει μια μεταβλητή myInt τύπου int και την αρχικοποιεί με την μετατροπή της myDouble σε int. Η μετατροπή γίνεται με τη χρήση της εκφραστικής γλώσσας (int). Αυτό το χαρακτηριστικό ονομάζεται casting και μετατρέπει την τιμή μιας μεταβλητής σε άλλον τύπο δεδομένων. Στην προκειμένη περίπτωση, η τιμή της myDouble μετατρέπεται σε int και αποθηκεύεται στη μεταβλητή myInt. Η μετατροπή αυτή αφαιρεί τα δεκαδικά ψηφία και παραμένει μόνο ο ακέραιος μέρος της τιμής.

[adinserter block=”3″]

Τελικά, η μεταβλητή myDouble περιέχει την τιμή 3.14, ενώ η μεταβλητή myInt περιέχει την τιμή 3.

Είναι σημαντικό να σημειωθεί ότι η ευρεία μετατροπή δεδομένων μπορεί να οδηγήσει σε απώλεια ακρίβειας, καθώς η μετατρεπόμενη τιμή μπορεί να υπερβαίνει το εύρος αναπαράστασης του νέου τύπου δεδομένων. Αυτό συμβαίνει όταν ο νέος τύπος έχει μικρότερη χωρητικότητα από τον αρχικό τύπο. Ως αποτέλεσμα, η τιμή του μετατρεπόμενου δεδομένου μπορεί να παρουσιάζει ανακρίβειες ή να μην αντιπροσωπεύει πλήρως την αρχική τιμή.

Για αυτόν τον λόγο, είναι σημαντικό να είστε προσεκτικοί κατά τη χρήση ευρείας μετατροπής. Πριν προχωρήσετε σε μετατροπή δεδομένων, πρέπει να εξετάσετε τις ακριβείς απαιτήσεις του προγράμματος και να λάβετε υπόψη τυχόν απώλειες ακρίβειας που μπορεί να προκύψουν. Αν υπάρχει ανησυχία για την απώλεια ακρίβειας, θα πρέπει να εξετάσετε εναλλακτικές λύσεις ή τρόπους αναπαράστασης των δεδομένων που εξυπηρετούν καλύτερα τις απαιτήσεις σας.

Παρακάτω έχουμε ένα παράδειγμα μετατροπών:

public class TypeCastingExample {
  public static void main(String[] args) {
    int myInt = 10;
    double myDouble = myInt; // widening casting (αύξηση τύπου)

    System.out.println("Value of myDouble: " + myDouble);

    double myDouble2 = 3.14;
    int myInt2 = (int) myDouble2; // narrowing casting (μείωση τύπου)

    System.out.println("Value of myInt2: " + myInt2);
  }
}

Ο παραπάνω κώδικας δείχνει παραδείγματα τύπων μετατροπής (type casting) στην Java. Ακολουθούν οι λεπτομέρειες:

  1. Στη γραμμή 6, ο αρχικός ακέραιος αριθμός myInt αντιγράφεται σε μια μεταβλητή myDouble τύπου διπλής ακρίβειας (double). Αυτή η μετατροπή γνωρίζεται ως “αύξηση τύπου” (widening casting). Στη συνέχεια, η τιμή του myDouble εκτυπώνεται στην οθόνη.
  2. Στη γραμμή 11, ο αρχικός διπλός αριθμός myDouble2 αντιγράφεται σε μια μεταβλητή myInt2 τύπου ακέραιου (int) με τη χρήση του casting (int). Αυτή η μετατροπή γνωρίζεται ως “μείωση τύπου” (narrowing casting). Ο αριθμός myDouble2 περιέχει την τιμή 3.14, αλλά με τον μετατροπέα σε ακέραιο, η δεκαδική μέρα αγνοείται και η τιμή του myInt2 γίνεται 3. Τέλος, η τιμή του myInt2 εκτυπώνεται στην οθόνη.

Ο κώδικας δείχνει την διαδικασία τύπων μετατροπής σε Java, που επιτρέπει την αλλαγή του τύπου μιας μεταβλητής από έναν τύπο δεδομένων σε άλλο.

Όταν εκτελεστεί ο παραπάνω κώδικας, το αποτέλεσμα που θα εμφανιστεί στην οθόνη θα είναι:

Value of myDouble: 10.0
Value of myInt2: 3

Πρώτα εκτυπώνεται η τιμή της μεταβλητής myDouble, η οποία περιέχει τον ακέραιο αριθμό 10, αλλά μετατράπηκε σε double. Έπειτα, εκτυπώνεται η τιμή της μεταβλητής myInt2, η οποία περιέχει τον αριθμό 3, αφού ο διπλός αριθμός 3.14 μετατράπηκε σε int.

9 Ιουνίου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων